最少01翻转次数
2517 最少01翻转次数
小b有一个01序列,她每次可以翻转一个元素,即将该元素异或上1。
现在她希望序列不降,求最少翻转次数。
输入
第一行输入一个数n,其中1≤n≤20000; 第二行输入一个由‘0’和‘1’组成的字符串
输出
输出一个非负整数,表示翻转次数
输入样例
6
010110
输出样例
2
思路:变换后左边的数全为0,右边的数全为1
sum[i][1]表示前i个数1的个数,sum[i][0]表示后n-i个数0的个数;
找到min(sum【i】【0】+sum【i】【1】)即可
#include<iostream> using namespace std; string a; int sum[20005][2]; int main(){ int n; cin>>n; cin>>a; int la=a.size(); sum[0][1]=0; for(int i=0;i<la;i++){ if(a[i]=='0') sum[i+1][1]=sum[i][1]; else sum[i+1][1]=sum[i][1]+1; } sum[la][0]=0; for(int i=la-1;i>=0;i--){ if(a[i]=='0') sum[i][0]=sum[i+1][0]+1; else sum[i][0]=sum[i+1][0]; } int minn=200005; for(int i=0;i<=la;i++){ if(sum[i][1]+sum[i][0]<minn) minn=sum[i][1]+sum[i][0]; } cout<<minn<<endl; return 0; }