小b有一个01序列,她每次可以翻转一个元素,即将该元素从0变1或者从1变0。
现在她希望序列不降,求最少翻转次数。
Input
第一行输入一个数n,其中1≤n≤20000; 第二行输入一个由‘0’和‘1’组成的字符串
Output
输出一个非负整数,表示翻转次数
Sample
Input | Output |
---|---|
6 010110 | 2 |
AC代码,难得写了个精简些的
#include<bits/stdc++.h>
using namespace std;
long long a[20005];
int main() {
int n, ind = 1, num = 999999;
char c;
scanf("%d%*c", &n);
while (n--) {
scanf("%c", &c);
if (c == '1')a[ind]++;
a[ind] += a[ind - 1];
ind++;
}
ind--;
for (int i = 0; i <= ind; i++) {
int k = a[i] + a[i] + ind - i - a[ind];
if ( k < num && k >= 0)
num = k;
}
printf("%d\n", num);
return 0;
}