fzu-2253
A - Salty Fish
?FZU - 2253海邊躺著一排咸魚,一些有夢(mèng)想的咸魚成功翻身(然而沒有什么卵用),一些則是繼續(xù)當(dāng)咸魚。一個(gè)善良的漁夫想要幫這些咸魚翻身,但是漁夫比較懶,所以只會(huì)從某只咸魚開始,往一個(gè)方向,一只只咸魚翻過去,翻轉(zhuǎn)若干只后就轉(zhuǎn)身離去,深藏功與名。更準(zhǔn)確地說,漁夫會(huì)選擇一個(gè)區(qū)間[L,R],改變區(qū)間內(nèi)所有咸魚的狀態(tài),至少翻轉(zhuǎn)一只咸魚。
漁夫離開后想知道如果他采取最優(yōu)策略,最多有多少只咸魚成功翻身,但是咸魚大概有十萬條,所以這個(gè)問題就交給你了!
包含多組測(cè)試數(shù)據(jù)。
每組測(cè)試數(shù)據(jù)的第一行為正整數(shù)n,表示咸魚的數(shù)量。
第二行為長(zhǎng)n的01串,0表示沒有翻身,1表示成功翻身。
n≤100000
在漁夫的操作后,成功翻身咸魚(即1)的最大數(shù)量。
對(duì)于第一個(gè)樣例,翻轉(zhuǎn)區(qū)間[2,3],序列變?yōu)? 1 1 1 0。
對(duì)于第二個(gè)樣例,翻轉(zhuǎn)整個(gè)區(qū)間,序列變?yōu)? 0 1。
思路:相當(dāng)于求最達(dá)子序列和。把1看成-1,0看成1
代碼:
#include<cstdio> using namespace std; int main() {int n;while(~scanf("%d",&n)){int num=0,j=0,max=-1,x;for(int i=1;i<=n;i++){scanf("%d",&x);if(x==1){j++;num=num-1;if(num<0)num=0;}if(x==0){num=num+1;if(num>max)max=num;}}printf("%d\n",j+max);}return 0; }總結(jié)
- 上一篇: grandle下载安装图解
- 下一篇: fzu-2258