hdu 1789 贪心算法源代码 此题大致思路,既然要计算最少扣多少分,就要在最后时间之前把扣分最多的作业先安排了。如果扣分一样多的话,那必然要把时间比较紧的先安排了。所以先按扣分的高低,由高向低排序,如果两门课扣分相同就按他们的结束时间由低向高排序!然后安排即可!
[cpp] view plaincopyprint? 01.#include<stdio.h> 02.#include<stdlib.h> 03.#include<string.h> 04.#define N 1000 05.int f[N+5]; 06.struct T 07.{ 08. int deadline; 09. int score; 10.}homework[N+5]; 11.int cmp(const void*a,const void*b) 12.{ 13. if((*(struct T*)a).score!=(*(struct T*)b).score) 14. return (*(struct T*)b).score-(*(struct T*)a).score; 毕业论文 15. else 16. return (*(struct T*)a).deadline-(*(struct T*)b).deadline; 17.} 18.int main() 19.{ 20. int C,n,i,j,sum; 21. scanf("%d",&C); 22. while(C--) 23. { 24. memset(f,0,sizeof(f)); 25. scanf("%d",&n); 26. for(i=0;i<n;i++) 27. scanf("%d",&homework[i].deadline); 28. for(i=0;i<n;i++) 29. scanf("%d",&homework[i].score); 30. qsort(homework,n,sizeof(homework[0]),cmp); 31. for(i=0,sum=0;i<n;i++) 32. { 33. for(j=homework[i].deadline;j>0;j--) //从最后的期限开始考虑前几天有没有被安排 34. { 35. if(f[j]==0) 36. { 37. f[j]=1;break; 38. } 39. } 40. if(j==0) //如果一直到结束都没有空余时间,最后只能扣分 41. sum+=homework[i].score; 42. } 43. printf("%d\n",sum); 44. } 45. return 0; 46.}
|