hdu 1789 Doing Homework again

贪心算法。
给你一个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;
}


 

原文地址:https://www.cnblogs.com/yyf573462811/p/6365327.html