Codeforces Round 906 (Div. 2)

Codeforces Round 906 (Div. 2)

比赛链接

A. Doremy's Paint 3

题目链接
判断给定的数组是不是满足a1+a2=a2+a3=a3+a4=......=an-1+an

A思路:

这个题一开始没有读仔细问题,导致一时间出错了,后来读清楚问题之后发现其实这个数组中只能出现两个数字,且两个数字之间的差值最多是1

A代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n;
    cin>>n;
    std::vector<int> v(n);
   
    for(int i=0;i<n;i++){
        cin>>v[i];
    }
    sort(v.begin(),v.end());
    if(v[0]==v[n-1]){
        cout<<"YES"<<endl;
        return ;
    }
    int ans1,ans2;
    ans1=ans2=0;
    for(int i=0;i<n;i++){
        if(v[i]==v[0]) ans1++;
        if(v[i]==v[n-1]) ans2++;
    }
    if(abs(ans1-ans2)>1){
        cout<<"NO"<<endl;
        return ;
    }
    if(ans1+ans2!=n){
        cout<<"NO"<<endl;
        return ;
    }
    cout<<"YES"<<endl;
    return ;
}
int main(){
    int t=1;
    cin>>t;
    
    while(t--){
        solve();
    }
    return 0;
}

B. Qingshan Loves Strings

题目链接
构造一个完美字符串string s
要求si不能等于si-1
给两个字符串s,t,可以将t插入s中使得s成为完美字符串

B思路:

数据量不是很大,所以一次for循环是可以解决的,只是需要在插入时候注意一下如何使得这个字符串变完美就好了,注意插入的字符串头和尾不能和原字符串插入的位置相同!

B代码:

#include<bits/stdc++.h>
using namespace std;
bool check(string s){
    int l=s.length();
    for(int i=1;i<=l-1;i++){
        if(s[i]==s[i-1]){
            return false;
        }

    }
    return true;
    
}
void solve(){
    int n,m;
    cin>>n>>m;
    string s,t;
    cin>>s>>t;
    if(check(s)){
        cout<<"YES"<<endl;//如果自身就满足这个情况就不需要再添加了
        return ;
    }
    if(!check(t)){
        cout<<"NO"<<endl;
        return ;
    }
    for(int i=1;i<=n-1;i++){
        if(s[i]==s[i-1]&&(s[i-1]==t[0]||s[i]==t[m-1])){
            cout<<"NO"<<endl;
            return ;
        }
    }
    cout<<"YES"<<endl;

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

}

C. Qingshan Loves Strings 2

题目链接

C思路:

首先就是进行一个特殊情况的判断:
1.如果字符串的长度不是偶数直接输出-1
2.如果01的个数不相等,那么也直接输出-1
我们在插入01字符串的时候同时也要更新字符串的长度,因为下一次比较的位置就不一样了

C代码:

#include<bits/stdc++.h>
using namespace std;
const int N=110*310;
char s[N];
// string s;
int n;

void insert(int x){
    for(int i=n;i>=x+1;i--){
        s[i+2]=s[i];
    }    
    s[x+1]='0';
    s[x+2]='1';
    n+=2;

}
void solve(){
    // int n;
    cin>>n;
    // string s;
    // cin>>s;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    /*
    首先就是进行一个特殊情况的判断:
    1.如果字符串的长度不是偶数直接输出-1
    2.如果01的个数不相等,那么也直接输出-1
    */
    std::vector<int> v;
    if(n%2){
        cout<<-1<<endl;
        return ;
    }
    int res=0;
    for(int i=1;i<=n;i++){
        int x=s[i]-'0';
        res+=x;

    }
    if(res*2!=n){
        cout<<-1<<endl;
        return ;
    }
    int l=0;
    int r=n;
    while(l<r){
        if(s[l+1]!=s[r]){
            l++;
            r--;
        }
        else{
            if(s[l+1]=='0'&&s[r]=='0'){
                v.push_back(r);
                insert(r);
                l++,r++;
            }
            else{
                v.push_back(l);
                insert(l);
                l++,r++;

            }
        }
    }
    cout<<v.size()<<endl;
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}
int main(){
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
posted @ 2023-11-02 12:43  du463  阅读(16)  评论(0编辑  收藏  举报