HDU 1789(模拟&贪心_G题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789

-----------------------------------------------------------------------------------

题意:作业,有deadline和惩罚分。如果deadline之前未完成,按惩罚分扣除,问惩罚分的最小值。

思路:贪心的想法,按照罚时从大到小排序,尽可能在deadline那天完成,如果不行,向前递推,占据之前天数完成的时间。然后标记天数,如果之前天数都被标记了。那么,一定需要受到惩罚。也就是说,把惩罚大的作业先安排,安排在deadline之前的可行天。如果不行,加上惩罚。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct SS
{ 
    int dl;
    int pe;
}time[1000+5];

int cmp (SS a, SS b)  
{  
 
    return a.pe > b.pe;  

}  

int main(void){
    int T =0;
    scanf("%d",&T);
    for(int i=0;i<T;i++){
        int n=0;
        scanf("%d",&n);
        for(int j=0;j<n;j++){
            scanf ("%d", &time[j].dl);
        }
        for(int j=0;j<n;j++){
            scanf ("%d", &time[j].pe);
        }
        sort(time,time+n,cmp);
        int ans = 0;
        int flag[1000+5]={0};
        for (int m=0; m<n; m++)  
        {      
            int j=0;
            for(j=time[m].dl; j>=1; --j)
                if(flag[j]==0)  
                {  
                    flag[j] = 1;  
                    break;  
                }  
            if(j == 0)  
                ans += time[m].pe;  
        }  
        printf ("%d\n", ans);  
    }

    return 0;
}
View Code

 

posted @ 2018-01-22 08:55  caomp  阅读(140)  评论(0)    收藏  举报