刷题记录24

【对比算法】
链接: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变量来解决。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页