思路:
求出字符串中的前缀和(即前i个字符中1的个数)。遍历一遍,令[0,i]变成0,[i+1,n-1]的位置变为1,比较每个i位置的翻转次数,取最小值。
AC代码:
#include<iostream>
using namespace std;
int a[22000];
int main()
{
int n;
string s;
int minn=22000;
cin>>n;
cin>>s;
for(int i=0;i<n;i++)
{
a[i+1]=a[i]+s[i]-'0';//a[i]即为前缀和
}
for(int i=0;i<=n;i++)
{
minn=min(minn,a[i]+n-i-(a[n]-a[i]));a[i]表示前i个数都变成0需要的翻转数,n-i-(a[n]-a[i])表示后n-i个数变成全变成1需要的翻转数。
}
cout<<minn<<endl;
return 0;
}