Educational Codeforces Round 161 (Rated for Div. 2)(A-C)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


A. Tricky Template

题意:

给出三个由小写字母组成的字符串a,b,c,问是否存在一个模板串t,使得a,b与模板串相匹配,c与模板串不匹配。匹配条件有两个,若t的某个字母为小写,则a与之对应的位置相等,若t的某个字母为大写,则a与之对应的字母不同。每个位置都满足,则a和t相匹配,否则不匹配。

题解:

枚举a,b,c每一位,当 a i a_{i} ai= b i b_{i} bi = = = c i c_{i} ci时,此时 t i t_{i} ti为任何字母时,都满足对a,b,c匹配;当 a i a_{i} ai= b i b_{i} bi ! = != != c i c_{i} ci时,存在 t i t_{i} ti = = = a i a_{i} ai,满足对 a i a_{i} ai b i b_{i} bi匹配,与 c i c_{i} ci不匹配;当 a i a_{i} ai!= b i b_{i} bi ! = != != c i c_{i} ci时,存在 t i t_{i} ti,满足对 a i a_{i} ai b i b_{i} bi匹配,与 c i c_{i} ci不匹配;当 a i a_{i} ai= b i b_{i} bi,且 c i c_{i} ci= a i a_{i} ai或者 c i c_{i} ci= b i 时 b_{i}时 bi t i t_{i} ti只能为大写字母,且与 a i a_{i} ai, b i b_{i} bi, c i c_{i} ci都匹配,记录与a,b,c都匹配的元素个数,若个数等于字符长度则不存着这样的模板串,否则存在。

代码:

#include<iostream>
#include<algorithm>

using namespace std;

const int N=25;

char a[N],b[N],c[N];

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		scanf("%s",a);
		scanf("%s",b);
		scanf("%s",c);
		
		int cnt=0;
		for(int i=0;i<n;i++)
		{
			if(a[i]!=b[i]&&(c[i]==a[i]||c[i]==b[i])) cnt++;
			if(a[i]==b[i]&&a[i]==c[i]) cnt++;
		}
		if(cnt==n)cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
	return 0;
}


B. Forming Triangles

题意:

给出一个长度为n的数组m,存在n个小棍,每根小棍的长度为 2 m i 2^{m_{i}} 2mi,问由这些木棍可以构成多少个三角形。

题解:

假设组成的三角形最长的边是 2 c 2^{c} 2c,其次是 2 b 2^{b} 2b 2 a 2^{a} 2a,则满足 c c c > = >= >= b b b > = >= >= c c c,且 2 a 2^{a} 2a+ 2 b 2^{b} 2b> 2 c 2^{c} 2c,只有当 c c c = = = b b b时同时满足两个不等式,且 a a a只要满足小于等于 c c c即可。设数组中存在cnt个数值为t的数字,且存在m个小于t的数字,当cnt>=3时,存在 C c n t 3 C_{cnt}^3 Ccnt3个三边都为t的三角形,同时存在 C 3 2 C_{3}^2 C32 ∗ * m m m个两边为 2 t 2^{t} 2t,一边为小于 2 t 2^{t} 2t的三角形,若cnt=2时存在 C 3 2 C_{3}^2 C32 ∗ * m m m,两边为 2 t 2^{t} 2t,一边小于 2 t 2^{t} 2t的边。

代码:

#include<iostream>
#include<algorithm>
#include<map>
#define int long long
using namespace std;

int t;
void solve(){
	int n;
	int m=0;
	int sum=0;
	map<int,int> mp;
	
	cin>>n;
	
	for(int i=0;i<n;i++){
		int x;
		
		cin>>x;
		
		mp[x]++;
	}
	for(auto mp:mp){
		int  t=mp.second;
		if(t>=3) sum+=t*(t-1)*(t-2)/6+t*(t-1)/2*m;
		else if(t==2) sum+=t*(t-1)/2*m;
		m+=t;		
	}
	cout<<sum<<endl;
}
signed main(){
	cin>>t;
	
	while(t--) solve();
	
	return 0;
}

C. Closest Cities

题意:

在一条线上有n个城市,每个城市的坐标为 a i a_{i} ai,以下是收费规则,设 a a a, b b b, c c c为三个相邻得的城市,若 b b b距离 a a a最近则路费仅需 1 1 1元, b b b, c c c之间的路费则为 c − b c-b cb元,问要想从 l l l r r r最少需要多少钱。

题解:

由题意知,从 l l l r r r最少花费就是从 l l l l + 1 l+1 l+1, l + 2 l+2 l+2,… r r r;这种路径花费才是最少,若其中两点为 a a a, b b b,若 a a a距离 b b b最近则花费为 1 1 1,否则花费为 b − a b-a ba,利用前缀和知识解决。

代码:

#include<iostream>
#include<algorithm>

using namespace std;

const int N=1e5+10;
int a[N],b[N],c[N];
int t;
void solve(){
	int n,m;
	
	cin>>n;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	
	b[1]=0;
	b[2]=1;
	for(int i=3 ;i<=n;i++){
		if(a[i]-a[i-1]<a[i-1]-a[i-2]) b[i]=1;
		else b[i]=a[i]-a[i-1];
	}
	for(int i=1;i<=n;i++) b[i]+=b[i-1];
	c[n]=0;
	c[n-1]=1;
	for(int i=n-2;i>=1;i--){
		if(a[i+2]-a[i+1]>a[i+1]-a[i]) c[i]=1;
		else c[i]=a[i+1]-a[i];
	}
	for(int i=n-1;i>=1;i--) c[i]+=c[i+1];
	cin>>m;
	
	while(m--){
		int l,r;
		
		cin>>l>>r;
		
		if(l<r) cout<<b[r]-b[l]<<endl;
		else cout<<c[r]-c[l]<<endl;
	}
}
int main(){
	int t;
	
	cin>>t;
	
	while(t--) solve();
	
	return 0;
}

  • 40
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"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级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值