洛谷 P5650 【基礎字符串練習題】

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章