链接:CFA
由于技术有限,写个A题题解安慰自己,大佬轻点喷
题意:给定一串01型的字符串,求经过多次转化后的字符串
思路:如果是010型就可转化成111,如果是101型就不可转化成111
这里发现一个问题,这里看NOTE部分给出的样例二,就会发现第一遍转化的结果和第二遍的转化的结果是一样的,若题目给出m的值很大时,就会做了无必要的循环,对这个题目而言就容易超时。这个时候需要给程序来一个判断条件,当所有0的左边是1,右边是1或者全是0的时候跳出循环
这里借鉴了一下队友的代码
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int a[10005];
int b[10005];
int main()
{
int t;
cin >> t;
getchar();
while (t--) {
/*********************** input **********************/
memset(a, 0, sizeof(a)); //初始化数组
int n, m;
cin >> n >> m;
string str;
cin >> str;
for (int i = 1; i <= n; i++) {
a[i] = str[i - 1] - '0'; //字符串转化
}
/*********************** handle **********************/
while (m--) {
bool flag = false; //初始化判断条件
int j = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == 0) {
if (a[i + 1] == 1 && a[i - 1] == 0) {
b[j++] = i; //这里是用数组b来记录a数组中要改变值的位置
}
else if (a[i + 1] == 0 && a[i - 1] == 1) {
b[j++] = i;
}
}
}
for (int i = 0; i < j; i++) {
a[b[i]] = 1; //将符合条件的位置的值改变
}
for(int i=1;i<=n;i++)
if((a[i]==0&&a[i]!=1)||(a[i]==0&&a[i-1]!=1)||(a[i]==0&&a[i+1]==0)) //这里是判断
{
flag=true; //判断条件,如果不满足0的左边是1,右边是1或者全是0的时候,flag为真,跳出for循环
break;
}
if(flag==false) //flag为真继续while循环,为假则跳出
break;
}
/*********************** output **********************/
for (int i = 1; i <= n; i++) {
cout << a[i]; //输出答案
}
cout << endl;
}
return 0;
}
小小牛马,刚刚入门codeforces,水平有限,轻点喷!