Codeforces Round 913 (Div. 3)

A. Rook

打印出象棋车的下一步

using namespace std;
void solve(){
	string s;
	cin>>s;
	char a=s[0];
	char b=s[1];
	set<string>ans;
	for(char i='1';i<='8';i++){
		string t="";
		t+=a;
		t+=i;
		ans.insert(t);
	}
	for(char i='a';i<='h';i++){
		string t="";
		t=t+i;
		t=t+b;
		ans.insert(t);
	}
	for(auto c:ans){
		cout<<c<<"\n";
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

B. YetnotherrokenKeoard

题意:image

image

思路:用栈来模拟

using namespace std;
void solve(){
	string s;
	cin>>s;
	int n=s.size();
	s=" "+s;
	vector<int>da;
	vector<int>xiao;
	vector<int>vis(n+1);
	for(int i=1;i<=n;i++){
		if(s[i]=='B'&&da.size()){
			vis[da.back()]=1;
			da.pop_back();
		}else if(s[i]=='b'&&xiao.size()){
			vis[xiao.back()]=1;
			xiao.pop_back();
		}else if(s[i]>='a'&&s[i]<='z'){
			xiao.push_back(i);
		}else{
			da.push_back(i);
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i] && s[i] != 'B' && s[i] != 'b')cout << s[i];
	}
	cout<<"\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

C. Removal of Unattractive Pairs

题意:给定一个字符串,可以将相邻两个不同的字符消掉,问最后最少有多少个字符

image

思路:先考虑将最多出现的字符消掉,如果其他所有的字符加起来都无法将最多的消掉,那么答案应该是

image

如果其他的字符不大于最多的那个字符

如果是偶数,就是0

如果是奇数,就是1

using namespace std;
void solve(){
	int n;
	string s;
	cin>>n>>s;
	map<int,int>mp;
	for(int i=0;i<n;i++){
		mp[s[i]]++;
	} 
	int mx=0;
	for(auto c:mp){
		int x=c.second;
		mx=max(mx,x);
	}
	if(mx<(n-mx)){
		if(n&1){
			cout<<1<<"\n";
		}else{
			cout<<0<<"\n";
		}
	}else{
		cout<<n-2*(n-mx)<<"\n";
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

D. Jumping Through Segments

题意:给你n个区间,你从0出发,每次可以跳跃不大于k的距离,并且要在l[i]~r[i]中,问你最小的k是多少?

思路:个人感觉比简单,二分的裸题,如果人的跳跃的范围区间与l[i]~r[i]没有交集就返回false

#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>a;
bool check(int x){
	int t1=0;
	int t2=0;
	for(auto c:a){
		t1-=x;
		t2+=x;
		int x1=c.first;
		int x2=c.second;
		if(t1>x2||t2<x1)return false;
		else{
			t1=max(t1,x1);
			t2=min(t2,x2);
		}
	}
	return true;
}
void solve(){
	a.clear();
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int l,r;
		cin>>l>>r;
		a.push_back({l,r});
	}
	int l=0,r=1e9+10;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	cout<<r<<"\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

E. Good Triples

题意:给定一个n,找出满足下面关系的三元组

image

image

并且image

思路:这个其中有无数的可能性,有点像dp的思想

先预处理一下 1~9的方案数

然后遍历n,将所有位数的方案乘起来

using namespace std;
int cnt[10];
void solve(){
	string s;
	cin>>s;
	int n=s.size();
	long long ans=1;
	for(int i=0;i<n;i++){
		ans*=(cnt[s[i]-'0']);
	}
	cout<<ans<<"\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	for(int i=0;i<=9;i++){
		for(int j=0;i+j<=9;j++){
			for(int k=0;i+j+k<=9;k++){
				cnt[i+j+k]++;
			}
		}
	}
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 
posted @ 2023-12-09 10:20  yufan1102  阅读(43)  评论(0)    收藏  举报