Codeforces EDU 189

观前提醒,本题解仅针对本人写过的题,题目思路仅供参考

若有新思路欢迎分享

A

题目描述

题目描述

题解

签到题,只要保证\(y \leq 2x\)即可

示例代码

#include<bits/stdc++.h>
using namespace std;
void solveA(){
    long long a,b;
    cin>>a>>b;
    if(a*2>=b){
    }
    else{
        cout<<"Yes"<<endl;
    }
}
int main(){
    int t;cin>>t;
    while(t--)
        solveA();
}

B

题目描述

题目描述

题解

这道题的题目描述有很大坑,恼()

对于需要处理的字符串,我们不妨先去判断一下这个字符串是不是已经交替,如果已经交替输出"Yes"即可

之后就去查看非交替字符串能否通过以上处理形成交替字符串了

我们完全可以先生成已知的符合要求的字符串,然后模拟上述两个操作即可

时间复杂度是\(O(4*n)\),其中\(4\)作为常数可以忽略不计,对于\(n==2 \times 10^5\)是可以接受的

示例代码

#include<bits/stdc++.h>
using namespace std;
bool check1(string s){
    for(int i=0;i<s.size()-1;i++){
        if(s[i]==s[i+1]){
            return false;
        }
    }
    return true;
}//检查是否原本就是交替字符串
bool check2(const string& a,const string& b,int l,int r){
    for(int i=l,j=r;i<=r;i++,j--){
        if(a[j]!=b[i]){
            return false;
        }
    }
    return true;
}//检查子串翻转后是否满足要求
bool check3(const string& a,const string& b,int l,int r){
    for(int i=l,j=r;i<=r;i++,j--){
        char c=(a[j]=='a')?'b':'a';
        if(c!=b[i]){
            return false;
        }
    }
    return true;
}//检查子串翻转并更改字母后是否满足要求
bool trycia(const string& a,const string& b){
    int n=a.size();
    int l=-1,r=-1;
    for(int i=0;i<n;i++){
        if(a[i]!=b[i]){
            if(l==-1){
                l=i;
            }
            r=i;
        }
    }
    if(l==-1){
        return true;
    }
    return check2(a,b,l,r)||check3(a,b,l,r);
}//尝试找到满足要求的子段进行处理
void solveB(){
    string s;
    cin>>s;
    if(check1(s)){
        cout<<"YES"<<endl;
        return;
    }
    int n=s.size();
    string aa(n,'a'),bb(n,'a');
    for(int i=0;i<n;i++){
        aa[i]=(i%2==0)?'a':'b';
        bb[i]=(i%2==0)?'b':'a';
    }
    if(trycia(s,aa)||trycia(s,bb)){
        cout<<"YES"<<endl;
    }
    else{
        cout<<"NO"<<endl;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        solveB();
    }
}

C

题目描述

题目描述

题解

两种满足条件的格子,要么是上下两个单格子一样,要么是左右两个单格子一样。

考虑清楚两种情况的话,就需要合理分配两种格子的分配情况了,注意左右两个格子一样的话那么就不能有上下格子一样的情况,所以我们可以通过动态规划来决定这里是否要更改

状态转移方程是\(dp[i]=min(dp[i-1]+a[i-1],dp[i-2]+b[i-2])\)(a表示上下格子不一样的情况,b表示左右格子不一样的情况)

时间复杂度是\(O(n)\),可以接受

示例代码

#include<bits/stdc++.h>
using namespace std;
void solveC(){
    int n;cin>>n;
    string s1,s2;cin>>s1>>s2;
    vector<int> a(n),b(n-1),dp(n+1,0);
    for(int i=0;i<n;i++){
        a[i]=(s1[i]!=s2[i]);
    }
    for(int i=0;i<n-1;i++){
        b[i]=(s1[i]!=s1[i+1])+(s2[i]!=s2[i+1]);
    }
    dp[1]=a[0];
    for(int i=2;i<=n;i++){
        dp[i]=min(dp[i-1]+a[i-1],dp[i-2]+b[i-2]);
    }
    cout<<dp[n]<<endl;

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

D

题目描述

posted @ 2026-04-22 17:18  xiaoyintx  阅读(9)  评论(0)    收藏  举报