ABC346_B Piano
整体思路:字符串操作+大模拟
当时我的思路是这样的:首先,我要一直复制基本字符串直到字符串的长度≥w+b。然后还要判断一下用可能环回来是最优解。
这是一开始的代码
#include<bits/stdc++.h>
using namespace std;
string s="";
void solve(){
int w,b;cin>>w>>b;
while(1){
s+="wbwbwwbwbwbw";
if(s.size()>=w+b) break;
}
int n=s.size();
for(int i=0;i<n-w-b+1;i++){
string t=s.substr(i,w+b);
int cnt1=0,cnt2=0;
int l=t.size();
for(int j=0;j<l;j++){
if(t[j]=='w') cnt1++;
else cnt2++;
}
if(cnt1==w&&cnt2==b){
cout<<"Yes"<<endl;
return ;
}
}
cout<<"No"<<endl;
return ;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
solve();
}
我以为我的程序判断了,其实没有。然后WA了一个点。找半天没有找到问题。
于是我就写了一个这个东西
solve1是我的程序。
solve2是题解的程序。
由于这个题目的数据大小不是很大,我就直接在程序里面对拍了。
代码如下
#include<bits/stdc++.h>
using namespace std;
bool solve1(int w,int b){
string s="";
while(1){
s+="wbwbwwbwbwbw";
if(s.size()>=w+b) break;
}
int n=s.size();
for(int i=0;i<n-w-b+1;i++){
string t=s.substr(i,w+b);
int cnt1=0,cnt2=0;
int l=t.size();
for(int j=0;j<l;j++){
if(t[j]=='w') cnt1++;
else cnt2++;
}
if(cnt1==w&&cnt2==b){
return 1;
}
}
return 0;
}
bool solve2(int w,int b){
const string t = "wbwbwwbwbwbw";
for (int i = 0; i < (int) t.size(); i++) {
int nw = 0, nb = 0;
for (int j = 0; j < w + b; j++) {
if (t[(i + j) % t.size()] == 'w') ++nw;
else ++nb;
}
if (w == nw and b == nb) {
return 1;
}
}
return 0;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
for(int i=1;i<=100;i++){
for(int j=1;j<=100;j++){
bool f1=solve1(i,j),f2=solve2(i,j);
if(f1!=f2){
cout<<"WA!"<<endl;
cout<<i<<' '<<j<<endl;
cout<<f1<<' '<<f2<<endl;
return 0;
}else{
cout<<"AC!"<<endl;
}
}
}
}
然后我就惊讶的发现我的程序没有判断回头的情况,然后赶紧改AC了。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main(){
int w,b;cin>>w>>b;
string s="";
while(1){
s+="wbwbwwbwbwbw";
if(s.size()>=w+b) break;
}
s+=s;
int n=s.size();
for(int i=0;i<n-w-b+1;i++){
string t=s.substr(i,w+b);
int cnt1=0,cnt2=0;
int l=t.size();
for(int j=0;j<l;j++){
if(t[j]=='w') cnt1++;
else cnt2++;
}
if(cnt1==w&&cnt2==b){
cout<<"Yes"<<endl;
return 0;
}
}
cout<<"No"<<endl;
return 0;
}
okk!

浙公网安备 33010602011771号