双向删除
有n个数,保存在数组a[1...n],每个数都是0或者1,每次操作可以删除数组第一个数或者删除数组最后一个数,
问至少多少次操作之后,使得数组剩下的数的和等于S。如果不能完成任务,输出-1。
输入格式
第一行,两个整数,n和S。 1<=n<=100000。 1<=S<=100000。
第二行,n个整数,第i个整数是a[i], a[i]是0或者1。
【提示】
有40%的数据, n<=100。
输出格式
一个整数。
输入/输出例子1
输入:
16 2
1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1
输出:
7
作答区域
#include<bits/stdc++.h>
using namespace std;
int n,s,r,h,x,y,he,l=1,a[100009];
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)cin>>a[i],he+=a[i];
for(int i=1;i<=n;i++)
{
h=h+a[i];
if(h+a[i+1]>s||i==n)
{
r=i,x=r-l+1;
if(x>y)y=x;
for(;;)
{
if(a[l]==1)
{
h--;
l++;
break;
}
else l++;
}
}
}
if(he<s)cout<<-1;
else cout<<n-y;
return 0;
}