题目描述
有若干个任务需要在一台机器上运行。
它们之间没有依赖关系,因此可以被按照任意顺序执行。
该机器有两个 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;
}
标签:int,max,Day4,CPU,&&,GPU,CCF,CSP,dp
From: https://www.cnblogs.com/mathblog/p/18457871