Educational Codeforces Round 163 (Rated for Div. 2)

Problem - A - Codeforces

构造一个长度为n的字符串(大写字母)
n为奇数,NO
n为偶数,直接AABBAABB...

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
void solve() {
	cin>>n;
	if(n%2){
		cout<<"NO"<<endl;
		return;
	}
	int flag=1;
	for(int i=1;i<=n;i+=2){
		if(flag) cout<<"AA";
		else cout<<"BB";
		flag^=1;
	}
	cout<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - B - Codeforces

长度为n的数组a
操作:在数组a中找一个大于等于10的元素,将其分解为一位一位的数字
操作次数不限
问能否使得数组a非降序
YES,NO

数据比较小,考虑暴力
从后往前遍历,如果前一个数比后一个数大,那么就要让前一个数分解

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=55;
int a[N];
int n;
void solve() {
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int tmp=a[n];
	for(int i=n-1;i>=1;i--){
		if(a[i]>tmp){//分解
			string s=to_string(a[i]);
			string t=s;
			sort(t.begin(),t.end());
			if(s!=t){
				cout<<"NO"<<endl;
				return;
			}
			if(t[(int)t.size()-1]-'0'>tmp){
				cout<<"NO"<<endl;
				return;
			}
			tmp=t[0]-'0';
		}
		else tmp=a[i];
	}
	cout<<"YES"<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - C - Codeforces

一共两行字符串,长度均为n,由<和>组成(箭头),n为偶数
机器人初始在(1,1),每秒钟机器人完成两个动作,第一个动作是上下左右选择一个,然后随着箭头的方向走
问能否到达(2,n)
YES,NO

括号内是错误思路
(如果第二行的最后两个都是左箭头,肯定NO
记录第一行连续左箭头的区间以及第二行连续左箭头的区间,然后两行相对应的区间不能有交集(直接从小到大枚举所有区间,因为自身区间不可能有交集,所以不用分一二行),如果有,则NO
不一定是有交集 ,如果刚好补上也不行,也就是说中间没有空缺)

题目读错了,做了一个小时,做了个假题,以为是可以顺着箭头一直走,然后就认定是低配版的关鸡(2024牛客寒假训练营1的B题),但实际上只能顺着箭头走一格
然后产生了以下假代码

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
string s1,s2;
struct node{
	int x,y;
	bool operator<(const node &W)const{
		return x<W.x;
	}
};
void solve() {
	cin>>n;
	cin>>s1>>s2;
	if(s2[n-1]=='<'&&s2[n-2]=='<'){
		cout<<"NO"<<endl;
		return;
	}
	bool ok=false;
	int l,r;
	vector<node>ans;
	for(int i=0;i<n;i++){
		if(!ok&&s1[i]=='<'){
			l=i;
			ok=true;
		}
		else if(ok&&s1[i]=='>'){
			r=i-1;
			if(r>l) ans.push_back({l,r});
			ok=false;
		}
	}
	if(ok&&n-1>l) ans.push_back({l,n-1});
	ok=false;
	for(int i=0;i<n;i++){
		if(!ok&&s2[i]=='<'){
			l=i;
			ok=true;
		}
		else if(ok&&s2[i]=='>'){
			r=i-1;
			if(r>l) ans.push_back({l,r});
			ok=false;
		}
	}
	if(ok&&n-1>l) ans.push_back({l,n-1});
	sort(ans.begin(),ans.end());
	for(int i=0;i<(int)ans.size();i++) cout<<ans[i].x<<' '<<ans[i].y<<endl;
	for(int i=1;i<(int)ans.size();i++){
		if(ans[i].x<=ans[i-1].y+1){
			cout<<"NO"<<endl;
			return;
		}
	}
	cout<<"YES"<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
//    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

所以读题一定要慢,一个字一个字读,读错就做假题吧
直接用bfs搜索,先上下左右走一步,再根据所在位置的箭头方向走一步,最终看是否能到达(2,n)
 

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=2e5+10;
int n;
char s[3][N];
bool vis[3][N];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void solve() {
	cin>>n;
	memset(vis,false,sizeof vis);
	for(int i=1;i<=2;i++){
		for(int j=1;j<=n;j++){
			cin>>s[i][j];
		}
	}
	queue<PII>q;
	q.push({1,1});
	vis[1][1]=true;
	while(q.size()){
		auto t=q.front();
		int x=t.first,y=t.second;
		q.pop();
		for(int i=0;i<4;i++){
			int tx=x+dx[i],ty=y+dy[i];
			if(tx<1||tx>2||ty<1||ty>n||vis[tx][ty]) continue;
			if(s[tx][ty]=='<') ty--;
			else ty++;
			if(tx<1||tx>2||ty<1||ty>n||vis[tx][ty]) continue;
			q.push({tx,ty});
			vis[tx][ty]=true;
		}
	}
	if(vis[2][n]) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - D - Codeforces

用小写字母去替换问号,使得串联重复的最长子串最长
长度n最多只有5000,双重循环暴力没问题
枚举长度len,然后check该长度是否合法(s[i]去和s[i+len]匹配,如果可以匹配就计数++,否则计数清0,看能否达到len),取最大的长度

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
string s;
void solve() {
	cin>>s;
	int n=s.size();
	s=' '+s;
	int ans=0;
	for(int len=1;len<=n/2;len++){//枚举长度,即枚举答案
		int cnt=0;
		for(int i=1;i<=n-len;i++){
			if(s[i]==s[i+len]||s[i]=='?'||s[i+len]=='?') cnt++;//记录匹配了几个
			else cnt=0;
			if(cnt>=len) {
				ans=max(ans,len*2);
				break;
			}
		}
	}
	cout<<ans<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值