赛时切掉了,很简单。
题目描述
你会得到一个长度为 的二进制字符串
和一个初始为空的二进制字符串
。在比赛过程中,你可以进行以下任意一种操作任意次数:
-
从
中移除某个后缀,并将其添加到
的末尾。
-
从
中移除某个后缀,并将其添加到
的末尾。
为了赢得比赛,你需要通过最少的操作次数,使得 中只包含字符
,而 中只包含字符
。请你找到所需的最少操作次数。
输入输出要求
-
输入:共
组数据,每一组数据中,包含一个正整数
表字符串长度,接下来是一个二进制字符串
。
-
输出:一个整数,表示使
只包含
且只包含
所需的最少操作次数。
思路
根据题目模拟,很容易想出这样的解法:
遍历字符串 ,找到第一个非
的元素,该元素及其后面的元素就都是要被移除到
中的。
之后遍历字符串 ,找出其中第一个非
的元素,该元素及其后面的元素都需要回到字符串
中。
反复这样的过程,直到 中不包含非
元素为止(达成题目要求,此时字符串
中当然只有
。
代码
#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<string.h>
using namespace std;
const int N=1e3+5;
int T;
string t;
bool check(string a) {
int len=a.size();
for(int i=0; i<len; i++) if(a[i]=='1') return 0;
return 1;
}
int main() {
cin>>T;
while(T--) {
int n, ans=0;
string a;
cin>>n>>a;
t="";
while(!check(a)) {
for(int i=0; i<n; i++) {
if(a[i]=='1') {
string suba=a.substr(i);
t+=suba; ans++; a=a.substr(0, i);
break;
}
}
int len=t.size();
for(int i=0; i<len; i++) {
if(t[i]=='0') {
string subt=t.substr(i);
a+=subt; ans++; t=t.substr(0, i);
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}
check用于检测字符串数组 是否达到题目条件。
(根据习惯还是用 当变量名了

1048

被折叠的 条评论
为什么被折叠?



