Codeforces Round 908 (Div. 2) A-C

发布时间 2023-11-09 09:43:42作者: Beater_1117

Codeforces Round 908 (Div. 2)

A. Secret Sport

题意:

一个长为n的字符串,A表示A赢,B表示B赢。当一局比赛中A或B赢下X场,则A或B赢得此局。当A或B赢下Y局,则其胜利。结束比赛

思路:

最后一场比赛的获胜者就是整个比赛的获胜者

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

void solve(){
    int n;
    cin>>n;
	string s;
    cin>>s;
    if(s[n-1]=='A'){
        cout<<'A'<<endl;
    }else{
        cout<<'B'<<endl;
    }
}

int main(){
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

B. Two Out of Three

题意:

有一个长为n的数组a,构造一个长度为n的数组b,使得刚好满足以下三个条件中的两个:ai=aj, bi=1, bj=2; ai=aj, bi=1, bj=3;ai=aj, bi=2, bj=3.

思路:

a中存在至少两对相同的数,否则输出-1。第一对可构造1、2,剩下的为1;第二对构造2、3,剩下的为3;剩余的都为1.

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

void solve(){
    int n;
    cin>>n;
    int a[n+1];
    int mp[110];
    int count=0;
    int i1,i2,i3,i4;
    memset(mp,0,sizeof(mp));
    vector <int > q;
    q.clear();
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
        if(mp[a[i]]==2){
            count++;
            if(count<=2){
                q.push_back(a[i]);
            }
        }
    }
    if(count<2){
        cout<<-1<<endl;
    }else{
        int count1=2;
        int count2=2;
        for(int i=1;i<=n;i++){
            if(a[i]==q[0]){
                if(count1==2){
                    cout<<1<<" ";
                    count1--;
                }else if(count1==1){
                    cout<<2<<" ";
                    count1--;
                }else{
                    cout<<1<<" ";
                }
            }else if(a[i]==q[1]){
                if(count2==2){
                    cout<<2<<" ";
                    count2--;
                }else if(count2==1){
                    cout<<3<<" ";
                    count2--;
                }else{
                    cout<<3<<" ";
                }
            }else{
                cout<<1<<" ";
            }
        }
        cout<<endl;
    }
}

int main(){
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

C. Anonymous Informant

题意:

选取一个数组a,取a中的一个数,使a[x]=x,然后把整个数组左移x个单位,经过k次操作后,数组a等于数组b,则输出Yes,否则输出No。

思路:

当我们选取一个数a[x]并左移后,该数会被移动到数组的最后一位,因此我们可以由数组b倒着推回去,选取最后一个位置。出现重复的位置则说明出现循环可以直接输出Yes,若最后一位大于n则操作中止输出No。

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

void solve(){
    int n;
    ll k;
    cin>>n>>k;
    ll b[n+1];
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    int mp[n+1];
    memset(mp,0,sizeof(mp));
    int idx=n;
    while(k>0){
        if(b[idx]>n){
            cout<<"No"<<endl;
            return ;
        }
        mp[idx]++;
        if(mp[idx]==2){
            break;
        }
        idx=(idx-b[idx]+n)%n;
        if(idx==0){
            idx=n;
        }
        k--;
    }
    cout<<"Yes"<<endl;
}

int main(){
    ios::sync_with_stdio(false);
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}