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 }