题目描述

有若干个任务需要在一台机器上运行。

它们之间没有依赖关系,因此可以被按照任意顺序执行。

该机器有两个 CPU 和一个 GPU

对于每个任务,你可以为它分配不同的硬件资源:

在单个 CPU 上运行。

在两个 CPU 上同时运行。

在单个 CPUGPU 上同时运行。

在两个 CPUGPU 上同时运行。

一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中断,直到执行结束为止。

第 \(i\) 个任务用单个 CPU,两个 CPU,单个 CPUGPU,两个 CPUGPU 运行所消耗的时间分别为 \(a_i,b_i,c_i\) 和 \(d_i\)。

现在需要你计算出至少需要花多少时间可以把所有给定的任务完成。

输入格式

输入的第一行只有一个正整数 \(n\),是总共需要执行的任务个数。

接下来的 \(n\) 行每行有四个正整数 \(a_i,b_i,c_i,d_i\),以空格隔开。

输出格式

输出只有一个整数,即完成给定的所有任务所需的最少时间。

数据范围

\(1≤n≤40,1≤a_i,b_i,c_i,d_i≤10\)

输入样例:

3
4 4 2 2
7 4 7 4
3 3 3 3

输出样例:

7

样例解释

有很多种调度方案可以在 \(7\) 个时间单位里完成给定的三个任务,以下是其中的一种方案:

同时运行第一个任务(单 CPU 加上 GPU)和第三个任务(单 CPU),它们分别在时刻 \(2\) 和时刻 \(3\) 完成。

在时刻 \(3\) 开始双 CPU 运行任务 \(2\),在时刻 \(7\) 完成。

题目分析

\(dp\)

思路尚不正确,有待优化

\(dp(i , j , k)\) 表示CPU1时间为\(i\),CPU2时间为\(j\),GPU时间为\(k\)的完成任务个数

C++代码

60分

#include <bits/stdc++.h>

using namespace std;

const int N = 50 , M = 220;

int n , m;
int a[N] , b[N] , c[N] , d[N];
int dp[M][M][M]; int main()
{
cin >> n;
int m1 = 0 , m2 = 0;
for(int i = 1 ; i <= n; i ++)
{
cin >> a[i] >> b[i] >> c[i] >> d[i];
if(i % 2) m2 += a[i];
else m1 += a[i];
} m = max(m1 , m2); for(int i = 1 ; i <= n ; i ++)
for(int j = m ; j >= 0 ; j --)
for(int k = m ; k >= 0 ; k --)
for(int l = m ; l >= max(j , k) ; l --)
{
// CPU1
if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);
// CPU2
if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);
// CPU1 + CPU2
if(j >= b[i] && k >= b[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - b[i]][k - b[i]][l] + 1);
// CPU1 + GPU
if(j >= c[i] && l >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - c[i]][k][l - c[i]] + 1);
// CPU2 + GPU
if(k >= c[i] && l >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - c[i]][l - c[i]] + 1);
// CPU1 + CPU2 + GPU
if(k >= d[i] && l >= d[i] && j >= d[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - d[i]][k - d[i]][l - d[i]] + 1);
} int res = m; for(int j = 0 ; j <= m ; j ++)
for(int k = 0 ; k <= m ; k ++)
for(int l = 0 ; l <= m ; l ++)
if(dp[j][k][l] == n)
res = min(res , max(j , max(k , l))); cout << res << '\n';
return 0;
}

50分

#include <bits/stdc++.h>

using namespace std;

const int N = 50 , M = 210;

int n , m;
int a[N] , b[N] , c[N] , d[N];
int dp[M][M][M]; int main()
{
cin >> n;
for(int i = 1 ; i <= n; i ++)
{
cin >> a[i] >> b[i] >> c[i] >> d[i];
m += a[i];
} m /= 2; for(int i = 1 ; i <= n ; i ++)
for(int j = m ; j >= 0 ; j --)
for(int k = m ; k >= 0 ; k --)
for(int l = max(j , k) ; l >= 0 ; l --)
{
// CPU1
if(j >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - a[i]][k][l] + 1);
// CPU2
if(k >= a[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - a[i]][l] + 1);
// CPU1 + CPU2
if(j == k && j >= b[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - b[i]][k - b[i]][l] + 1);
// CPU1 + GPU
if(j == l && j >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - c[i]][k][l - c[i]] + 1);
// CPU2 + GPU
if(k == l && k >= c[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j][k - c[i]][l - c[i]] + 1);
// CPU1 + CPU2 + GPU
if(k == l && j == k && k >= d[i]) dp[j][k][l] = max(dp[j][k][l] , dp[j - d[i]][k - d[i]][l - d[i]] + 1);
} int res = m; for(int j = 0 ; j <= m ; j ++)
for(int k = 0 ; k <= m ; k ++)
for(int l = 0 ; l <= m ; l ++)
if(dp[j][k][l] == n)
res = min(res , max(j , max(k , l))); cout << res << '\n';
return 0;
}

Day4 备战CCF-CSP练习的更多相关文章

  1. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  2. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  3. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  4. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  5. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  6. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  7. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  8. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  9. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  10. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

随机推荐

  1. 搞定 XLSX 预览?别瞎找了,这几个库(尤其最后一个)真香!

    -   Hey, 我是 沉浸式趣谈 -   本文首发于[沉浸式趣谈],我的个人博客 **https://yaolifeng.com** 也同步更新. -   转载请在文章开头注明出处和版权信息. - ...

  2. Mastik:微体系结构侧信道攻击工具包

    1. 引言 微体系结构侧通道攻击利用了处理器内部组件的竞争,从而泄漏了进程之间的信息.虽然从理论上讲这类攻击很简单,但实际的实现方式往往很复杂,并且需要对文献记载不充分的处理器函数和其他领域专有的知识 ...

  3. ​.NET AI Preview 2 发布:支持 Aspire 与 Qdrant 向量库集成,加速云原生 AI 开发​

    引言 随着人工智能(AI)技术的迅猛发展,开发者对简单.高效的AI开发工具需求日益增加.微软 .NET 团队最近发布了 .NET AI 模板的 Preview 2 版本,这一更新为开发者带来了诸多令人 ...

  4. 45分钟从零搭建私有MaaS平台和生产级的Qwen3模型服务

    今天凌晨,阿里通义团队正式发布了 Qwen3,涵盖六款 Dense 模型(0.6B.1.7B.4B.8B.14B.32B)和两款 MoE 模型(30B-A3B 和 235B-A22B).其中的旗舰模型 ...

  5. Java---switch...case中case可以匹配些什么

    switch-case语句 case 标签可以是 : •类型为 char.byte.short 或 int 的常量表达式. •枚举常量. •从 Java SE 7 开始,case 标签还可以是字符串字 ...

  6. 【HUST】网安|多媒体数据安全实验|LSB隐写和DCT域JSTEG+F4+F5隐写及检测

    文章目录 LSB空域隐写 原理 值对现象原理 实验内容 DCT域隐写 JSteg F4 F5 代码仓库:代码.嵌入提取使用的图像.jpeg_tool库.实验报告_Gitee. 实验环境:MATLAB ...

  7. 操作系统综合题之“采用记录型信号量机制实现进程INPUT、PROCESS和OUTPUT的同步算法(代码补充)”

    1.问题:系统中有有三个进程INPUT.PROCESS和OUTPUT,共用两个缓冲区BUF1和BUF2.假期设BUF1中最多可放10个数据,现已放入了2个数据:BUF2最多可放5个数据.INPUT进程 ...

  8. SQL 强化练习 (四)

    继续每日一练 sql 肯定会无敌强的后面. 恰好今天项目弄报表这块, 用了国产的 BI 工具, 帆软Report, 除了页面控件做得有些 low 外, 我感觉其他各方面都特别适合做 中国式的报表. 明 ...

  9. 为Java虚拟机分配堆内存大于机器物理内存会怎么样?

    之前在某个地方看到的一个问题,"如果为Java虚拟机指定的堆内存大于物理内存会怎么样?",今天正好又看到了HotSpot VM中关于为堆分配内存的源代码实现,顺便从源代码角度解答一 ...

  10. Node v18.6 发布的这个新特性未来可能改变前端工程化

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...