Codeforces Round #779 (Div. 2) A-C

time:Mar/27/2022
22:35UTC+8

A题:

化简题意知序列必须为0110110110......这样循环往复,所以要设置一个for循环,使得遇到第一个0不变,遇到两个连续的0会ans+=2,即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        string s;
        cin>>s;
        int ans=0;
        int last=-10;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                int diff=i-last-1;
                ans+=max(0,2-diff);
                last=i;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 B题:(规律题)

由样例和推理可知,求最大值则gcd必为2,那么就得有偶数个偶数分配到奇数上去,所以n&1时,cout<<"0"<<endl;然后观察n为偶数时,有n/2个奇数可以相互交换,不管顺序,有n/2个偶数可以相互交换,不换顺序,那么共有n个数时,ans=A(n/2,n/2)*A(n/2,n/2)%mod。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        ll ans=1;
        int n;
        cin>>n;
        if(n&1){
            cout<<"0"<<endl;
        }
        else{
            for(int i=1;i<=(n/2);i++){
                ans=(ans*i%mod*i)%mod;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

C题:(规律归纳题)

根据题目证明两个规律:n个数里面必然只有一个1,且从a[1]到a[n+1](a[n+1]=a[1])之间,a[i+1]-a[i]<=1。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+3;
int a[maxn];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            a[n+1]=a[1];
        }
        int cnt=0,flag=1;
    for(int i=1;i<=n;i++){
            if(a[i+1]>a[i]+1)    flag=0;
            if(a[i]==1)    cnt++;
        }
        if(cnt==1&&flag==1)    cout<<"YES"<<endl;
        else    cout<<"NO"<<endl;
    }
    return 0;
}
posted @ 2022-03-28 20:31  cf不上1500不改名  阅读(36)  评论(0)    收藏  举报