题目描述

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

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

该机器有两个 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. 一步到位js/javascript对象和querystring查询字符串互转(get/url参数)

    当然,这个问题又很多解决方式,这里说一种最简洁的方式: 对象转querystring查询字符串(get/url参数) 我看网上的方法都比较繁琐,其实可以直接使用js的URLSearchParams对象 ...

  2. 网鼎杯-phpweb

    找了一些php读取文件的函数尝试读取源码,试了一个readfile就成功了 <?php $disable_fun = array("exec","shell_exe ...

  3. 解决chrome浏览器拓展插件颜色变成透明无法使用。

    虚拟机装了chrome之后插件变成了透明的,没办法使用了. 解决办法如下: 1.卸载VMWARE tools 2.地址栏输入: chrome://flags 找到 "Choose ANGLE ...

  4. 小模型工具调用能力激活:以Qwen2.5 0.5B为例的Prompt工程实践

    在之前的分析中,我们深入探讨了cline prompt的设计理念(Cline技术分析:prompt如何驱动大模型对本地文件实现自主变更),揭示了其在激发语言模型能力方面的潜力.现在,我们将这些理论付诸 ...

  5. HttpServletResponse相关

    目录 返回给客户端数据:字节流和字符流 解决返回字节流和字符流乱码问题 万能解决乱码 文件下载 tomcat提供的默认下载方式 手动编写的DownloadServlet 返回给客户端数据:字节流和字符 ...

  6. 【记录】Python爬虫|爬取空间PC版日志模板

    目录 效果 运行结果 模板中免费的部分 损坏的模板 小彩蛋 代码 问题及解决方式 1. 返回数据_callback({})而非json 2. 获取封面图链接 注:2021/7/30做 效果 运行结果 ...

  7. 参考示例之“复制对象|拷贝对象|BeanUtils工具类学习”

    // 设置需要拷贝的字段 Set<String> targetSet = new HashSet<>(); targetSet.addAll(Arrays .asList(&q ...

  8. SQL 日常练习 (十八)

    也没啥, 就是入坑 sql 根本停不下来, 势必要达到所谓 "精通" 的地步. 从网上的例子也快搬运完了, 而工作中的 sql 又是万万不能外泄了. 因此想着, 该去哪里搬砖呢, ...

  9. JavaScript编程的10+最佳实践解决方案

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

  10. 远程服务器(腾讯云轻量服务器)上安装SQL Server以及SQL Server Management Studio,以及EFCore对其的连接

    SQL Server的安装 下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 安装教程参考:https://bl ...