贪心算法。
给你一个n代表功课的数目,下面两行各有n个数,第一行的n个数表示功课的截止日期,第二行表示不按时上交的话,所扣的分数。
求怎样安排,所口的分数最小。
首先按分数从大到小排序,若分数相同按时间从小到大排序,
然后,进行循环,当这一天没有功课被的话,将此功课安排大盘这一天,如果,这一天已经被安排,就往前推,最后安排不了就扣分。
#include"stdio.h" #include"string.h" #include"stdlib.h" typedef struct node { int time,score; }node; node a[1100]; int cmp(const void*a,const void*b) { node *c,*d; c=(node*)a; d=(node*)b; if(c->score!=d->score)//分数不同时,按从大到小排序 return d->score-c->score; else//分数相同,按时间的从小到大 return c->time-d->time; } int main() { int t,i,j,n,aa[1005]; int sum; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(aa,0,sizeof(aa)); for(i=0;i<n;i++) scanf("%d",&a[i].time); for(i=0;i<n;i++) scanf("%d",&a[i].score); qsort(a,n,sizeof(a[0]),cmp); sum=0; for(i=0;i<n;i++) { for(j=a[i].time;j>0;j--)//从当前一天开始向前倒退, { if(!aa[j])//如果这一天没事,则安排在这一天 { aa[j]=1;break; } } if(j==0)//当推到第0天时,说明无法安排进去,只能扣分。 sum+=a[i].score; } printf("%d\n",sum); } return 0; }