题意:输入一个只有1和0组成的字符串,将此字符串变成11111110000000或0000000001111111或0000000或1111111111型的最小改变量。
思路:比如一个字符串长为5,那就枚举变为01111、00111、00011、00001、00000、10000、11000、11100、11110、11111.每个最小改变量即可。只要知道思路,代码不难。但是这思路怎么想到呢!!!难啊,慢慢想想怎么到这个思路,就是说拿到这个题之后,我们该怎么处理给的字符串来求出最小改变量呢,有时候思路就一直是想怎么把这个给的字符串直接变成最小的那一个改变量的字符串,然后直接就得到最小改变量了。这个就要找到最小改变量对应的字符串,怎么找到这个字符串呢,因为字符串就是由1和0组成的,直接暴力枚举变成不同的字符串时的改变量就好了。其实暴力枚举求出最小改变量昨晚想到了,但是在实现方式上太蠢了,就是简单的枚举这个长的不同的good string 不就可以了吗???我当时还转换别的存储形式进行不同方式的加减,简直蠢。可以说我的思路想的太跑题了,把你的思路就放在它给的输入上处理不就好了么。
题外话:1如何将一个string倒叙存储 2.定义int的最大值
//此方法是逆序存储在自身上,存在别的穿上可以赋值到那个串上再reverse
#include <bits/stdc++.h>
#define MAX 0x7fffffff//MAX=2147483647
using namespace std;
int main()
{
string s;
cin>>s;
reverse(s.begin(),s.end());
cout<<s<<endl;
}
//cf 1363b
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
string s;
cin>>s;
int mm=2147483645;
int len=s.length();
for(int i=0;i<len;i++){
int sum=0;
for(int j=0;j<i;j++){
if(s[j]!='1') sum++;
}
for(int j=i;j<len;j++){
if(s[j]!='0') sum++;
}
mm=min(mm,sum);
}
for(int i=0;i<len;i++){
int sum=0;
for(int j=0;j<i;j++){
if(s[j]!='0') sum++;
}
for(int j=i;j<len;j++){
if(s[j]!='1') sum++;
}
mm=min(mm,sum);
}
cout<<mm<<endl;
}
}