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();
}
}

浙公网安备 33010602011771号