Codeforces Round #658解题报告A~C2

题目链接

A、Common Subsequence

水题,找两个数组中有没有相同的字符就可以了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N],b[N],pd[N];
int main()
{
    
    
    int t,n,m,k,l=0,r=0;
    cin >> t;
    while(t--){
    
    
        cin >> n >> m;
        memset(pd,0,sizeof pd);
        int ans = -1;
        for(int i=0;i<n;i++)
        {
    
    
            cin >> a[i];
            pd[a[i]] = 1;
        }
        for(int i=0;i<m;i++)
        {
    
    
            cin >> b[i];
            if(pd[b[i]]==1)
                ans = b[i];
        }
        if(ans!=-1)
            cout << "YES" <<endl << 1 << " " << ans <<endl;
        else
            cout << "NO" <<endl;
    }
 
    return 0;
}

B、Sequential Nim

博弈。
其实就是按照顺序从第一个堆开始取,可以一次取多个但只能在一个堆取,如果谁第一个遇见一个大于等于2的堆谁就获胜,先遇见的可以决定另外一个人的操作,如果大于2它可以一直拿到这个堆只有一个,让另一个人拿这一个,他就掌握到了主动权。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll a[N],b[N],pd[N];
int main()
{
    
    
    int t,n;
    cin >> t;
    while(t--){
    
    
        cin >> n;
        int i;
        for(i=0;i<n;i++)
            cin >> a[i];
        for(i=0;i<n;i++)
            if(a[i]>1)
                break;
        if(i!=n)
            i++;
        if(i%2==0)
            cout << "Second" <<endl;
        else
            cout << "First" <<endl;
    }
    return 0;
}

C2(C1)、Prefix Flip

题意:给你两个字符串a,b,问怎么操作能使a变成b。操作:可以使字符串的一段前缀逆反(1变成0,0变成1)然后整体反转。
思路:先把a串和b串变为单一串(即全是0或者全是1),然后把变的过程记录一下,a过程顺序b过程逆序输出即可。
看了大佬的思路,没想到还能这么想……

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
//ll a[N],b[N],pd[N];
int n;
char a[N],b[N];
vector<int>ans1,ans2;
void solve(char s[],vector<int> &ans)
{
    
    
    for(int i=1;i<=n-1;i++)
    {
    
    
        if(s[i]!=s[i+1])
            ans.push_back(i);
    }
    if(s[n]=='1')
    	ans.push_back(n);
}
int main()
{
    
    
    int t;
    cin >> t;
    while(t--)
    {
    
    
        cin >> n >> a+1 >> b+1; // a,b下标从1开始
        ans1.clear();
        ans2.clear();
        solve(a,ans1); // 注意传参是a,不是a+1
        solve(b,ans2);
        int sz1=ans1.size();
        int sz2=ans2.size();
        cout << sz1+sz2;
        for(int i=0;i<sz1;i++)
            cout << " " << ans1[i];
        for(int i=sz2-1;i>=0;i--) // 倒序输出
            cout << " " << ans2[i];
        cout <<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45949914/article/details/107521966