小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;
}
这是一个关于算法的问题,博客内容描述了如何通过翻转01序列中的元素,使得序列变得非降序,并求解最少翻转次数。提供的AC代码实现了一个解决方案,通过计算前缀和并遍历所有分割点,找到使序列非降序的最小翻转次数。

被折叠的 条评论
为什么被折叠?



