好久没用的尺取法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好久没用的尺取法相关的知识,希望对你有一定的参考价值。
海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼。一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名。更准确地说,渔夫会选择一个区间[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);
}
}
#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);
}
}
以上是关于好久没用的尺取法的主要内容,如果未能解决你的问题,请参考以下文章