P1475 智力大冲浪

470 阅读1分钟

image.png

image.png

image.png

因为不同的小游戏不能准时完成时具有不同的扣款权数,而且是求问题的最优解,所以很容易想到用贪心算法求解。

贪心策略是让扣款数额大的尽量在规定的期限内完成。

这样我们就先把这些任务按照扣款的数额进行排序,把大的排在前面,进行放置。

假如罚款最多的一个任务的完成期限是k,我们应该把它安排在哪个时段完成呢?应该放在小于等于k的最靠后的时间段。一旦出现一个不可能在规定期限内完成的任务,就直接扣钱

算法的时间复杂度是O(n^2) 部分代码: 注意初始化!

const int N=510;
int n,m,f[N];
struct node{
	int t,w;
}a[N];



void work()
{
	sort(a+1,a+1+n,cmp);
	for (int i=1;i<=n;i++)
	{
		bool pd=false;
		for (int j=a[i].t;j>=1;j--)
		{
			if (f[j]==0) //可以安排这个游戏 
			{
				f[j]=1;
				pd=true;
				break;
			}
		}
		if (pd==false) m-=a[i].w;
	}
}