Day4 备战CCF-CSP练习
题目描述
有若干个任务需要在一台机器上运行。
它们之间没有依赖关系,因此可以被按照任意顺序执行。
该机器有两个 CPU 和一个 GPU。
对于每个任务,你可以为它分配不同的硬件资源:
在单个 CPU 上运行。
在两个 CPU 上同时运行。
在单个 CPU 和 GPU 上同时运行。
在两个 CPU 和 GPU 上同时运行。
一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中断,直到执行结束为止。
第 \(i\) 个任务用单个 CPU,两个 CPU,单个 CPU 加 GPU,两个 CPU 加 GPU 运行所消耗的时间分别为 \(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练习的更多相关文章
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201703
CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201409-3 字符串匹配
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...
- CCF CSP 201503-3 节日
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...
随机推荐
- wpf 打开输入法、禁用输入法
1 <StackPanel Margin="10"> 2 <TextBox Text="默认"></TextBox> 3 & ...
- 获取IP地址避免XFF攻击(使用nginx)
//以下代码可以获取到客户端IP,但是可能会有XFF攻击,伪造IP地址 request.getHeader("x-forwarded-for"); 解决办法 //从Nginx中X- ...
- 最火向量数据库Milvus安装使用一条龙!
向量数据库是大模型应用开发必备组件之一,因为它在知识库.语义搜索.检索增强生成(RAG)等人工智能应用中发挥着举足轻重的作用.但向量数据有很多,为什么要使用 Milvus 呢? 常见向量数据 常见的向 ...
- 小程序简单 tab 切换实现
也是终于找到了数据可视化的最佳载体, 用小程序来做可视化简直完美. 尤其对于像我这种搞数据的, 数据分析, 数据报表, 可视化一直是一个巨大难题, 当我认识的最终的方案还是要用前端的时候, 感觉还有麻 ...
- C语言一点五编程实战:纯 C 的模块化×继承×多态框架
本文将大量涉及C语言高级操作,如函数指针.结构体指针.二级指针.指针频繁引用解引用.typedef.static.inline和C语言项目结构等知识,请确保自己不会被上述知识冲击,如果没有这顾虑,请尽 ...
- VMware Workstation 部署企业级 AD 域、DNS、DHCP 系统操作指南
一.主机环境规划 1. 虚拟机配置表 主机角色 操作系统 IP 地址 子网掩码 DNS 内存 硬盘 网络模式 域控制器 (DC) Windows Server 2022 192.168.1.10 25 ...
- 1-1, 一个简单的mysql 安装教程,基于mysql 5.7解压版本.
下载mysql. 略,去官网 1. 配置my.cnf. 把mysql提供的配置模板 copy到/etc/my.cnf (先读取/etc/my.cnf,再去读/etc/mysql/my.cnf,第三个读 ...
- HTTP接口的中文乱码问题【python版】
一.问题:在软件接口开发过程中,request返回的信息在print的时候出现了乱码.默认编码:ISO-8859-1问题原因:可以在request语句后面插入print(result.enco ...
- JVM垃圾回收机制常见算法
在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World.Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种G ...
- InheritableThreadLocal父子线程变量共享实现原理
概述 我们知道ThreadLocal 的设计初衷是为了解决多线程并发导致的线程安全问题,向每一个线程提供一个自己的变量副本,实现变量隔离.那如何在不同线程之间共享变量呢?InheritableTh ...