usaco 4.2 Job Processing 贪心

来源:互联网 发布:go并发编程实战 下载 编辑:程序博客网 时间:2024/04/30 05:39

 这道题目的思想是贪心,如果只有一道工序,那么很容易想到,只需要每次用当前空闲,并且能最早完成任务的机器处理即可,现在有两台机器,应该如何处理?

 

先看下面一个简单的引理:
对于两数组a[n],b[n], a[n]按升序排列,b[n]按降序排列,设数组c[i] = a[i] + b[i],则将an和bn分别重新排列后,再次得到 d[i] =a`[i]+b`[i],则 max(cn) < max(dn), 证明比较简单,从略。

现在来看原问题,分别对A工序和B工序求出完成k个零件的最短时间(1<=k<=n)ta[k], tb[k],将其从小到大排序,
则有结论:两道工序完成n个零件的最小时间是 max{ ta[k], ta[n+1-k] }

 

 

  1. #include <iostream>
  2. #include <algorithm>

  3. using namespace std;

  4. /*
  5. PROG: job
  6. LANG: C++
  7. ID: heben991
  8. */

  9. const int N = 2200;

  10. int n, m[2], need[2][N], finish[2][N], process[2][N];

  11. int main()
  12. {
  13.     int i, j, k, x, y, num, minp, mint, now;

  14.     freopen("job.in""r", stdin);
  15.     freopen("job.out","w",stdout);

  16.     scanf("%d%d%d", &n, &m[0], &m[1]);

  17.     for(i = 0; i  < 2; ++i)
  18.     {
  19.         for(j = 1; j <= m[i]; ++j) scanf("%d", need[i]+j);
  20.     }

  21.     for(i = 0; i < 2; ++i)
  22.     {
  23.         for(j = 1; j <= n; ++j)
  24.         {
  25.             mint = process[i][1]+need[i][1];
  26.             minp = 1;
  27.             for(k = 2; k <= m[i]; ++k)
  28.             if(process[i][k]+need[i][k] < mint)
  29.             {
  30.                 mint = process[i][k]+need[i][k];
  31.                 minp = k;
  32.             }
  33.             process[i][minp] = mint;
  34.             finish[i][j] = mint;
  35.         }
  36.     }

  37.     int ans = finish[0][1]+finish[1][n];
  38.     for(i = 2; i <= n; ++i)
  39.         ans >?= finish[0][i] + finish[1][n+1-i];

  40.     printf("%d %d/n", finish[0][n], ans);
  41.     return 0;
  42. }


原创粉丝点击