1. 程式人生 > >好久沒用的尺取法

好久沒用的尺取法

== esp include using can -- 海邊 測試數據 .cn

海邊躺著一排鹹魚,一些有夢想的鹹魚成功翻身(然而沒有什麽卵用),一些則是繼續當鹹魚。一個善良的漁夫想要幫這些鹹魚翻身,但是漁夫比較懶,所以只會從某只鹹魚開始,往一個方向,一只只鹹魚翻過去,翻轉若幹只後就轉身離去,深藏功與名。更準確地說,漁夫會選擇一個區間[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 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000009;
int a[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
int ans=0,sum=0,maxx=0,l=1,r=1,lz=-1,rz=-1;
for(int i=1; i<=n; ++i)
{
if(a[i]==0)
++sum;
else if(a[i]==1)
--sum;
if(sum<=0)
{
l=i+1;
sum=0;
}
if(sum>ans)
{
r=i;
ans=sum;
lz=l;
rz=r;
}
}
if(lz==-1&&rz==-1) {printf("%d\n",n-1);continue;}
int cnt=0;
for(int i=1; i<lz; ++i)
cnt+=(a[i]==1);
for(int i=lz; i<=rz; ++i)
cnt+=(a[i]==0);
for(int i=rz+1; i<=n; ++i)
cnt+=(a[i]==1);
printf("%d\n",cnt);
}
}

好久沒用的尺取法