1. 程式人生 > >Salty Fish(區間和)

Salty Fish(區間和)

one rec namespace printf mage amp print opened ron

Problem 2253 Salty Fish

Accept: 35 Submit: 121
Time Limit: 1000 mSec Memory Limit : 32768 KB

技術分享 Problem Description

海邊躺著一排鹹魚,一些有夢想的鹹魚成功翻身(然而沒有什麽卵用),一些則是繼續當鹹魚。一個善良的漁夫想要幫這些鹹魚翻身,但是漁夫比較懶,所以只會從某只鹹魚開始,往一個方向,一只只鹹魚翻過去,翻轉若幹只後就轉身離去,深藏功與名。更準確地說,漁夫會選擇一個區間[L,R],改變區間內所有鹹魚的狀態,至少翻轉一只鹹魚。

漁夫離開後想知道如果他采取最優策略,最多有多少只鹹魚成功翻身,但是鹹魚大概有十萬條,所以這個問題就交給你了!

技術分享 Input

包含多組測試數據。

每組測試數據的第一行為正整數n,表示鹹魚的數量。

第二行為長n的01串,0表示沒有翻身,1表示成功翻身。

n≤100000

技術分享 Output

在漁夫的操作後,成功翻身鹹魚(即1)的最大數量。

技術分享 Sample Input

5 1 0 0 1 0 3 0 1 0

技術分享 Sample Output

4 2

技術分享 Hint

對於第一個樣例,翻轉區間[2,3],序列變為1 1 1 1 0。

對於第二個樣例,翻轉整個區間,序列變為1 0 1。

技術分享 Source

福州大學第十四屆程序設計競賽_重現賽 //對於 1 的魚,翻身收益 -1 ,對於 0 的魚,收益為 1 ,先這麽處理,然後,就是求最大區間和的問題了
有個坑,因為必須要翻一次! 技術分享
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 #define MX 100010
 6 
 7 int a[MX];
 8 
 9 int main()
10 {
11     int n;
12     while (scanf("%d",&n)!=EOF)
13     {
14         int sum1=0;
15         for
(int i=1;i<=n;i++) 16 { 17 int x; 18 scanf("%d",&x); 19 sum1+=x; 20 if (x) a[i]=-1; 21 else a[i]=1; 22 } 23 int mmm=-1,rec=0; //mmm=-1 因為必須要翻一次,全為 1 時 24 for (int i=1;i<=n;i++) 25 { 26 if (rec>0) rec+=a[i]; 27 else rec=a[i]; 28 mmm = max(rec,mmm); 29 } 30 printf("%d\n",mmm+sum1); 31 } 32 return 0; 33 }
View Code

Salty Fish(區間和)