因为不同的小游戏不能准时完成时具有不同的扣款权数,而且是求问题的最优解,所以很容易想到用贪心算法求解。
贪心策略是让扣款数额大的尽量在规定的期限内完成。
这样我们就先把这些任务按照扣款的数额进行排序,把大的排在前面,进行放置。
假如罚款最多的一个任务的完成期限是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;
}
}