NC20019. [HNOI2001]产品加工
描述
输入描述
输入共n+1行第1行为 n。 n是任务总数(1 ≤ n ≤ 6000)第i+1行为3个[0,5]之间的非负整数t1,t2,t3,分别表示第i个任务在A机器上加工、B机器上加工、两台机器共同加工所需要的时间。如果所给的时间t1或t2为0表示任务不能在该台机器上加工,如果t3为0表示任务不能同时由两台机器加工。
输出描述
最少完成时间
示例1
输入:
5 2 1 0 0 5 0 2 4 1 0 0 3 2 1 1
输出:
9
Java 解法, 执行用时: 1440ms, 内存消耗: 37928K, 提交时间: 2022-04-26 15:55:35
import java.util.Scanner; import static java.lang.Math.max; import static java.lang.Math.min; public class Main { public static void main(String[] args) { int n, a, b, c; int o = 0; int t = 60000; int[] p = new int[30010]; Scanner in = new Scanner(System.in); n = in.nextInt(); p[0] = 0; for (int i = 1; i <= n; i++) { a = in.nextInt(); b = in.nextInt(); c = in.nextInt(); o += max(a, max(b, c)); for (int j = o; j >= 0; j--) { if (b != 0) p[j] += b; else p[j] = 60000; if (a != 0 && j >= a) p[j] = min(p[j], p[j - a]); if (c != 0 && j >= c) p[j] = min(p[j], p[j - c] + c); } } for (int i = 0; i <= o; i++) t = min(t, max(i, p[i])); System.out.println(t); } }
C++(clang++ 11.0.1) 解法, 执行用时: 358ms, 内存消耗: 564K, 提交时间: 2023-08-07 13:05:31
#include<iostream> #include<algorithm> using namespace std; const int N = 30010, INF = 0x3f3f3f3f; int t1, t2, t3, up; int n; int f[N]; int main() { cin>>n; for(int i = 1; i <= n; i ++) { scanf("%d%d%d",&t1, &t2, &t3); up += max(t1, max(t2, t3)); for(int j = up; j >= 0; j --) { int tem = INF; if(t1 && j - t1 >= 0)tem = min(tem, f[j - t1]); if(t2)tem = min(tem, f[j] + t2); if(t3 && j - t3 >= 0)tem = min(tem, f[j - t3] + t3); f[j] = tem; } } int res = INF; for(int i = 0; i <= up; i ++)res = min(res, max(i, f[i])); cout<<res<<endl; return 0; }