HDU 1789 Doing Homework again (贪心)

http://blog.csdn.net/dgq8211/article/details/7538060

题目链接:Click here~~

题意:

有 n 门作业,每门作业都有自己的截止期限,当超过截止期限还没有完成作业,就会扣掉相应的分数。问如何才能使扣分最少。

解题思路:

把 n 门作业按分数从大到小排序,然后每次都把作业安排在离它的截止期限最近的一天,并把此天标记为已用,若不能安排,则扣分。

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. struct T  
  6. {  
  7.     int score,date;  
  8. }A[1005];  
  9. bool cmp(const T& s1,const T& s2)  
  10. {  
  11.     return s1.score > s2.score;  
  12. }  
  13. int main()  
  14. {  
  15.     int z,n,ans;  
  16.     bool in[1005];  
  17.     scanf("%d",&z);  
  18.     while(z--)  
  19.     {  
  20.         memset(in,0,sizeof(in));  
  21.         ans = 0;  
  22.         scanf("%d",&n);  
  23.         for(int i=0;i<n;i++)  
  24.             scanf("%d",&A[i].date);  
  25.         for(int i=0;i<n;i++)  
  26.             scanf("%d",&A[i].score);  
  27.         sort(A,A+n,cmp);  
  28.         for(int i=0;i<n;i++)  
  29.         {  
  30.             int j;  
  31.             for(j = A[i].date;j >= 1;j--)  
  32.             {  
  33.                 if(!in[j])  
  34.                 {  
  35.                     in[j] = true;  
  36.                     break;  
  37.                 }  
  38.             }  
  39.             if(!j)  
  40.                 ans += A[i].score;  
  41.         }  
  42.         printf("%d\n",ans);  
  43.     }  
  44.     return 0;  
  45. }  

你可能感兴趣的:(HDU 1789 Doing Homework again (贪心))