A. Subtraction Game

题意:每次可以移走a或b个物品,无物品可移走的那个人输掉游戏,问开始有几个物品可以保证第二个人能够获胜

思路: 输出A+B

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

B. Permutations & Primes

题意:n大小的序列,问这个序列怎么排列时,他的子序列的MEX值是素数的个数最多

思路:由于2, 3都为素数,因此贪心,1在最中间,最左边一个素数,最右边一个素数,然后对n为 1 2 3 4 时特判一下即可

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int n;
    cin>>n;
    vector<int>q(n+1);
    if(n==2){
        cout<<"2 1\n";
        return;
    }
    if(n==1){
        cout<<1<<'\n';
        return;
    }
    if(n==3){
        cout<<"2 1 3\n";
        return;
    }
    q[1]=2;
    q[n]=3;
    q[(n+1)/2]=1;
    int cnt=4;
    for (int i = 1; i <=n ; ++i) {
        if(q[i]==0){
            q[i]=cnt++;
        }
    }
    for (int i = 1; i <=n ; ++i) {
        cout<<q[i]<<' ';
    }
    cout<<endl;
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

C. Particles

题意:一个大小为n的数组,对他进行操作:选择一个位置的数字,将他删除,然后合并两个相邻的数字为一个数字,最后只剩一个数字,问最大是多少

思路:当有负数时,我们发现可以把负数全部删除。如果只有负数时,我们发现可以只删左右两边的,最后剩一个,因此取max。然后当我们把负数删除后,剩下正数,我们发现相加的过程只能是同为奇数项的相加或者同为偶数项的相加,最后我们取个max(奇,偶);

代码;

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int n;
    cin>>n;
    vector<int >q(n+1);
    int g=0;
    for (int i = 1; i <=n ; ++i) {
        cin>>q[i];
        if(q[i]>=0)
            g=1;
    }
    if(!g){
        cout<<*max_element(q.begin()+1,q.end())<<endl;
    }
    else{
        for (int i = 1; i <=n ; ++i) {
            if(q[i]<0)q[i]=0;
        }
        int s1=0,s2=0;
        for (int i = 1; i <=n ; i+=2) {
            s1+=q[i];
        }
        for (int i = 2; i <=n ; i+=2) {
            s2+=q[i];
        }
        cout<<max(s1,s2)<<endl;

    }

}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

D. Row Major

题意:将一共大小为n的字符串,通过他的因子进行分离成矩阵,比如n为8,分为

1 × 8 -> 2 × 4 -> 4 × 2 -> 8 × 1 这样的每个矩阵都保证他们相邻的两个格子的字母不同

思路:跟因子有关,我们可以发现当我们的字母的个数为最小的非因子时,每一次转化后,因为字母的循环周期(这个非因子)不是因子,又因为相邻的两个格子%因子相等,但%这个循环周期,是不相等的,那么就可以保证任何转化的矩阵之中都可以满足相邻的不相等,又因为n为1e6,如果周期>=26的话,那么n是包含1到26所有因子,26!>>1e6,因此这个周期不会超过26,因此只用小写拉丁字母即可表示这个字符串

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
set<int>st;

void  solve(){
    int n;
    cin>>n;
    int g=1;
    while(n%g==0)g++;
    for (int i = 0; i <n ; ++i) {
        cout<<char('a'+i%g);
    }
    cout<<endl;

}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}
posted on 2023-07-12 09:40  IR101  阅读(9)  评论(0编辑  收藏  举报  来源