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!

posted @ 2026-01-24 11:33  zhangruotian_Max  阅读(0)  评论(0)    收藏  举报