Codeforces Round 908 (Div. 2)

Problem - A - Codeforces

只有当一方赢了之后博弈才会结束,那么直接看最后一个是谁就是谁赢,因为如果对方赢了,就轮不到他了,游戏已经结束了

AC代码:

#include
#define endl '\n'
//#define int long long
using namespace std;
int n;
void solve() {
    cin>>n;
    string s;
    cin>>s;
    if(s[n-1]=='A') cout<<'A'<>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - B - Codeforces

构造题

某个字符个数大于等于2算一组,如果组数大于等于2就可以成功构造

其中一组的一个填2,另一组的一个填3,其余均填1

AC代码:

#include
#define endl '\n'
//#define int long long
using namespace std;
const int N=110;
int a[N],b[N];
int cnt[110];
int n;
void solve() {
    cin>>n;
    for(int i=1;i<=100;i++) cnt[i]=0;
    for(int i=1;i<=n;i++) cin>>a[i],cnt[a[i]]++,b[i]=1;
    int sum=0;
    sets;
    for(int i=1;i<=100;i++){
        if(cnt[i]>=2) sum++,s.insert(i); 
    }
    if(sum<2){
        cout<<-1<>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - C - Codeforces

首先,我们不可能一下子就能找到源头,何况有时候源头还不存在呢

我们只能从最终状态往前倒推

通过观察,可以发现,倒推的方法是将最后bn个数移到最前面(这个结论真的很难发现!!!),如果可以做这一步操作,我们就可以通过做这种操作k次来找到源头

我们并不是真正地进行移动,而是用一个指针不断地移动,进行循环移动,然后如果它所指向的值小于等于n则合法,否则不合法

如果重复了,那么就一定可以找到源头,直接退出循环,没必要再找了

AC代码:

#include
#define endl '\n'
//#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
bool vis[N];
int n,k;
void solve() {
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i],vis[i]=false;
    int now=n;
    bool ok=true;
    while(k--){
        if(vis[now]){
            break;
        }
        vis[now]=true;
        if(a[now]>n){
            ok=false;
            break;
        }
        now-=a[now];
        if(now<=0) now+=n;
    }
    if(ok) cout<<"Yes"<>t;
    while(t--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(codeforces,算法,c++)