hdoj 1789 简单贪心

题意 n门作业  每个作业有最迟完成时间。以及不完成扣分多少

分析:对score进行降序排,然后遍历。遍历时看对应分数的deadline那天是不是被占用了。。如果被占用向前推。要是有就在那天完成。。没有空的时间就扣分;

证明:假设排序后第一个元素的deadline值为5 那么表示在5天以内我必须完成它。不然完成其他的必然会导致多扣分,而它最好的完成时间就是deadline那天。被占用只能往前推

献上ac代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 struct st
 5 {
 6     int time;;
 7     int score;
 8     
 9 }a[1001];
10 int cam(const void *x,const void *y)
11 {
12     struct st p = *((struct st *)x);
13     struct st q = *((struct st *)y);
14     
15       return q.score-p.score;
16 
17     
18 }
19 int main()
20 {
21     int t;
22     scanf("%d",&t);
23     while(t--)
24     {
25         int n, vis[1001];
26         
27         scanf("%d",&n);
28         int i;
29         for(i=1;i<=n;i++)
30         {
31             scanf("%d",&a[i].time);
32         }
33         for(i=1;i<=n;i++)
34         {
35             scanf("%d",&a[i].score);
36         }
37         for(i=1;i<=n;i++)
38         //printf("%d %d\n",a[i].time,a[i].score);
39         qsort(&a[1],n,sizeof(a[1]),cam);
40         int count = 0;
41         int day=0;
42         int j;
43         memset(vis,0,sizeof(vis));
44         for(i=1;i<=n;i++)
45         {
46             
47             for(j=a[i].time;j>=1;j--)
48             {
49                 
50                 if(!vis[j])
51                 {
52                     
53                     vis[j]=1;
54                     break;
55                 }
56             }
57             if(j<=0)
58             count+=a[i].score; 
59         }
60         printf("%d\n",count);
61     
62         
63     } 
64     return 0;
65 }

 

posted on 2012-10-13 01:46  acmer_acm  阅读(250)  评论(0编辑  收藏  举报