Codeforces Round 908 (Div. 2)

发布时间 2023-11-09 09:43:44作者: yufan1102

A. Secret Sport

题意:A与B选手在下棋,规定下赢X把看作赢一局,一共赢Y把的那个是最后的赢家。
思路:因为不知道x,y到底是多少,n的范围是到20,所以只需要枚举x即可,时间复杂度不高,注意的是,如果枚举结果是A赢,那么给定字符串的最后一个值一定是A,反之也是。
#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n;
	cin>>n;
	string s;
	cin>>s;
    for(int i=1;i<=n;i++){
    	int ct=0,ct2=0;
    	int x=0,y=0;
    	for(int j=0;j<n;j++){
    		if(s[j]=='A')ct++;
    		else ct2++;
    		if(ct==i){
    			x++;
				ct=0;
				ct2=0; 
			}
			if(ct2==i){
				y++;
				ct=0;
				ct2=0;
			}
		}
		if(x>y&&s[n-1]=='A'){
			cout<<"A\n";
			return;
		}
		if(x<y&&s[n-1]=='B'){
			cout<<"B\n";
			return;
		}
	}
	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;
} 

B. Two Out of Three

题意:给定一个数组,判断是否能构造出一个数组,满足给定条件中的三个中的两个?
image
思路:通过分析可得,要想满足下面条件中的两个,该数组就必须要有两个或两个以上相同的数超过两组
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
vector<int>p[N];
int ans[N];
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=100;i++){
		p[i].clear();
		ans[i]=1;
	}
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        p[x].push_back(i);
	}
	int ct=0;
	for(int i=1;i<=100;i++){
		if(p[i].size()>=2&&ct==0){
			for(auto c:p[i]){
				ans[c]=2;
				ct++;
				break;
			}
			continue;
		}
		if(p[i].size()>=2&&ct>0){
			for(auto c:p[i]){
				ans[c]=3;
				ct++;
				break;
			}
		}
	}
	if(ct>=2){
		for(int i=1;i<=n;i++){
			cout<<ans[i]<<" ";
		}
		cout<<"\n";
	}else{
		cout<<-1<<"\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;
}