P5650
題意:
給你一個零一串,然後讓你找一個連續的字串,求這個字串內的0的個數減去1的個數最大.
小思路:
我們將0看做1,然後將1看做-1,然後求一下前綴和.
求前綴和的時候我們將當前這個位置的前綴和如果爲負數,那麼我們就將他賦成0
因爲如果是負數那麼他對後邊的貢獻就是負數,比零都要小,所以我們賦值成0,
然後我們把每一段的前綴和與ans去一個max,最後的時候輸出ans就好了
需要注意的是,題目中要求字串是非空的,我們就必須要選擇一個字串
因爲如果都是1的話,那麼我們不得不選一個,直接輸出-1就好
code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100010
#define M 1010
using namespace std;
int n, num[N];
char ch[N];
int main() {
gets(ch);
int len = strlen(ch);
for (int i = 0; i < len; i++)
if (ch[i] == '1') num[i + 1] = -1;
else num[i + 1] = 1;
int ans = -100000;
for (int i = 1; i <= len; i++) {
num[i] += num[i - 1];
if (num[i] < 0) num[i] = 0;
ans = max(ans, num[i]);
}
if (ans == 0) puts("-1");
else cout << ans;
}