Educational Codeforces Round 151 (Rated for Div. 2) A~D

比赛链接:Dashboard - Educational Codeforces Round 151 (Rated for Div. 2) - Codeforces

目录:

A. Forbidden Integer

B. Come Together

C. Strong Password

D. Rating System


A. Forbidden Integer

题意:给你三个整数n,k,x,你可以使用1~k中除x以外的任意数字,并且能使用无数次,问你能不能从中选出拼出n的数字。

 思路:若x不为1则输出n个1即可,若x为1,只有两种情况是拼不出n的:

①n为奇数且k=2,这说明了我们只能选择数字2,而数字2是拼不出奇数的。

②k等于1,此时我们什么数字都选不了,自然是拼不出n。

排除no的答案后,n为偶数的情况可以用n/2个2拼出,n奇数且n大于等于3的情况可以由n/2-1个2加上一个3来拼出。

代码:

void solve() {
	int n,k,x;
	cin>>n>>k>>x;
	if(x!=1) {
		cout<<"YES"<<endl;
		cout<<n<<endl;
		FOR(1,n) cout<<1<<" \n"[i==n];
	} 
	else if((n%2&&k==2)||k==1) cout<<"NO\n";
	else {
		cout<<"YES"<<endl;
		cout<<n/2<<endl;
		FOR(1,n/2) cout<<2<<" ";
		cout<<2+(n%2)<<endl;
	}
}

B. Come Together

题意:两个人同时从同一地点A出发,前往两个位置B和C,且分别采用步数最短的走法,问你能重叠的路径最多有多少个。

思路:分类讨论,若B点的横坐标和C点的横坐标相对于A点的纵坐标在同一侧,则对于答案的贡献为B点和C点与A的横坐标距离的较小值,也就是“公共横坐标路径”,公共纵坐标路径的贡献的计算同理。

代码:

void solve() {
	int ax,ay,bx,by,cx,cy,f1,f2,ans=0;
	cin>>ax>>ay>>bx>>by>>cx>>cy;
	int x1=abs(ay-by),y1=abs(ay-cy);
	int x2=abs(ax-bx),y2=abs(ax-cx);
	if((by>ay)==(cy>ay))ans+=min(x1,y1);
	if((bx>ax)==(cx>ax))ans+=min(x2,y2);
	cout<<ans+1<<endl;
}

C. Strong Password

题意:给定一个仅包含数字的字符串 s ,然后再给定 m 个区间 [li,ri](1<=i<=m),数字第i个位必须在这第i个区间的范围内,问能否从这 m 个区间中分别取出一个合法数字,拼成字符串后其不是字符串 s 的子序列。

思路:首先,对于每一位上数字的数字k,我们从它的范围[li,ri]遍历一遍,在遍历的过程中,若k在字符串中存在,则最优的选法是数字k在未被“删”去的字符串中第一次出现的相同数字的靠后位置。

例如,我们可以选择数字有:1,2,3,字符串s是111222333,我们的最优选择则是数字3,因为选了数字3,子序列的开头必须从标红数字开始——111222333,相当于把这个3前面的数字“111222”都“删”了,不用再考虑了,所以自然是删的越多越好。若我们选择了数字2,则子序列从111222333开始,“删”的数字少了,肯定不如选择数字3。

 若字符串s中未被“删”去的序列中找不到k,则直接输出yes。

代码:

void solve() {
	string s,t1,t2;
	int m,k=0;
	cin>>s>>m>>t1>>t2;
	FOR(0,m-1) {
		int maxx = 0;
		for (char j = t1[i]; j <= t2[i]; ++j) {
			int tmp = s.find(j, k);
			if (tmp>=s.size()) {
				cout<<"YES"<<endl;
				return;
			}
			maxx=max(maxx,tmp+1);
		}
		k = maxx;
	}
	cout<<"NO"<<endl;
}

D. Rating System

题意:找任意一个可能的值 k ,使得 n 轮比赛后的得分是最大的(得分为累加)。其中需要评分先到达 k,才会使得评分低于 k 后会保持k不变。

思路:可以得出的一个结论是:k一定等于某个前缀。因为若要使得k有意义,则一定要有一个前缀大于等于k,才会使得k有作用,也就是说k小于等于某个前缀,它才有作用。那么不妨让k取最大也就是等于某个前缀,然后枚举每个k作为每个前缀时的最终答案,枚举的答案为前缀加上最大的后缀。

为什么是最大的后缀呢?因为我们在枚举第i个位置作为前缀时,后面i+1~n的位置的负数贡献对于答案是没有意义的,贡献都是0。只有后缀为正数贡献才能使得最终的n发生改变,改变的量为i+1~n中最大的后缀。(注意i=0的情况也要枚举)

代码:

void solve() {
	int n,summ=0,maxx=0,ans=0;
	cin>>n;
	maxh[n+1]=0;
	FOR(1,n) {
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	ROF(n,1) {
		summ+=a[i];
		maxh[i]=max(maxh[i+1],summ);
	}
	FOR(0,n) {
		int k=sum[i]+maxh[i+1];
		if(k>maxx) {
			maxx=k;
			ans=sum[i];
		}
	}
	cout<<ans<<endl;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值