【对比算法】
链接:https://ac.nowcoder.com/acm/contest/950/E
来源:牛客网
刷题记录15
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:
首先,比赛时间分为n个时段,它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱w_iw
i,w_iw i 为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!
【代码】
sort(a+1,a+n+1,cmp); //从a+1开始,到a+n+1结束,调用cmp程序
int ans=0,t=0;
for(int i=1;i<=n;i++){ //将能完成的结束循环,剩下的为不能完成的
int tag=0;
for(int j=a[i].t;j;j--){
if(vis[j]==0){
vis[j]=1;
tag=1;
break;
}
}
if(tag==0){
for(int j=n;j;j--){
if(vis[j]==0){
vis[j]=1;
break;
}
}
ans+=a[i].val; //将不能完成的权值相加
}
}
cout<<m-ans; //注意:输出为m-ans
return 0;
}
刷题记录23
老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10,要求在 6 天内交,那么要想拿到这 10 学分,就必须在第 6 天结束前交。每个作业的完成时间都是只有一天。例如,假设有 7 次作业的学分和完成时间如下:最多可以获得15学分,其中一个完成作业的次序为2,6,3,1,7,5,4,注意可能还有其他方法。
你的任务就是找到一个完成作业的顺序获得最大学分
【代码】
sort(a,a+n,cmp); //根据cmp进行排序
int time=0;
int num=0;
for(int i=0;i<n;i++){
bool flag=false; //运用布尔变量进行判断相应的数组是否输出
if(a[i].t<time)continue; //如果时间小于0,则跳出循环
for(int j=a[i].t;j>=1;j--){
if(v[j]==0){
v[j]=1;
num+=a[i].m; //学分相加
flag=true; //布尔变量为真
break;
}
}
if(!flag){ //布尔变量为假,将学分的值存进time中
time=a[i].t;
}
}
cout<<num; //输出学分
return 0;
}
【感悟】
对比以上两个算法,第一个要求输出不符合条件的数组值,第二个要求输出符合条件的值,他们都是同一个算法。要求符合条件的输出,运用bool变量进行筛选,最后只需把他们的值相加;而要求输出不符合条件的则需将所有符合条件的值都跳出循环,也可以试用bool变量来解决。