洛谷1230
这个题就是一个贪心问题,具体分析:
要使罚款最少,我们显然应尽量完成c[i]值较大的工作。 此时,我们可以将工作按c[i]从大到小进行排序,然后按照排好的顺序依次对工作进行安排,安排的规则为:使处理工作i的时间既在t[i]之内,又尽量靠后;如果t[i]之内的时间都已经排满,就放弃处理此项工作。
证明:
假设按照上述方法得到的解不是最优的,那么必然存在某个工作j应当安排到处理的过程中,却没有得到安排。假设我们要将该工作安排进去,由于时间t[j]内都已经排满,就必然需要将一个已安排的工作k与之替换,而c[k]>=c[j],这样替换显然会增加罚款的数额。因此,除上述安排方法以外的安排方法都不会使罚款的数额减少,可得上述方法得到的结果是最优的。
思想就是类似于克鲁斯凯尔的最短路问题,证明也是这样.
具体代码:
#include<algorithm>
#include<cstdio>
using namespace std;
struct WORK{
int cost,time;
}work[501];
int n,m;
bool t[501];
bool COMP(WORK a,WORK b){return a.cost>b.cost;}
int main(){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++)
scanf("%d",&work[i].time);
for(int i=1;i<=n;i++)
scanf("%d",&work[i].cost);
sort(work+1,work+n+1,COMP);
for(int i=1;i<=n;i++){
m-=work[i].cost;
for(int j=work[i].time;j>=1;j--)
if(t[j]==0){
t[j]=1;
m+=work[i].cost;
j=0;
}
}
printf("%d",m);
return 0;
}

浙公网安备 33010602011771号