hdu 1789 doing homework again 贪心

题目链接

经典的贪心题目,仅对每节课的价值由大到小排序即可,依次看每堂课的时间,若此时间未被占用,标记占用了,若已占用,则时间向前移一位,若还占用,则继续移,若移到0时刻说明此任务完成不了,累加完成不了任务的价值,得出最后结果;

post code:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[2000];
struct node{
   int time,value;       
}job[2000];
int cmp(node a,node b){
     return a.value>b.value;    
}

int main()
{
    int n,i,x;
    scanf("%d",&x);
    while(x--){
        scanf("%d",&n);
        for(i=1;i<=n;i++)
           scanf("%d",&job[i].time);
        for(i=1;i<=n;i++){
           scanf("%d",&job[i].value);
        }
        sort(job+1,job+1+n,cmp);
        memset(a,0,sizeof(a));
        int sum=0;
        for(i=1;i<=n;i++){
           int t=job[i].time;
           while(t>0){
              if(a[t]==0){     // 若未被占用标记
                 a[t]=1;
                 break;
              }
              else t--;           
           }
           if(t==0)sum+=job[i].value;    //到0时刻说明完成不了任务了 累计完成不了任务的价值              
        }         
        printf("%d\n",sum);       
    }
      
} 


你可能感兴趣的:(算法)