高木さんBlog高木さん

Day4 备战CCF-CSP练习

高木さん·2024-10-11 10:16·12 次阅读

Day4 备战CCF-CSP练习

题目描述#

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

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

该机器有两个 CPU 和一个 GPU

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

在单个 CPU 上运行。
在两个 CPU 上同时运行。
在单个 CPUGPU 上同时运行。
在两个 CPUGPU 上同时运行。
一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中断,直到执行结束为止。

i 个任务用单个 CPU,两个 CPU,单个 CPUGPU,两个 CPUGPU 运行所消耗的时间分别为 ai,bi,cidi

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

输入格式#

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

接下来的 n 行每行有四个正整数 ai,bi,ci,di,以空格隔开。

输出格式#

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

数据范围#

1n40,1ai,bi,ci,di10

输入样例:#

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

输出样例:#

Copy
7

样例解释#

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

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

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

题目分析#

dp
思路尚不正确,有待优化
dp(i,j,k) 表示CPU1时间为iCPU2时间为jGPU时间为k的完成任务个数

C++代码#

60分#

Copy
#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分#

Copy
#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; }
posted @   她说戴了不算給  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
目录