(File IO): input:eat.in output:eat.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
小羊们上完课后,纷纷到草场上吃草。而羊村现在正在进行特色示范羊村检查,领导们想看看羊村的草场。
羊村的草场是连续分布的,每块草场上都有数量不等的羊在吃草。领导们想要查看连续若干个草场,但是又不想看到超过
T
T
T只羊。而村长希望领导们多看看羊村的风貌,尽可能多参观几个草场。
现在,请你帮村长决定,带领导们去参观哪一段草场,满足领导和村长的要求。
输入
第一行一个整数
N
N
N和
T
T
T,表示羊村共有多少个连续草场,以及领导们希望看到羊数量的最大值。
第二行
N
N
N个整数,两个整数间用一个空格分开,第i个数ai表示第i个草场上有
a
i
ai
ai只羊在吃草。编号从
1
1
1到
N
N
N。
输出
输出一行,共两个数,表示参观的起点编号和终点编号,中间用空格分开。走的方向总是从编号小的到编号大的。另外,若有长度相同的可能性,输出起点编号较小的答案。数据保证至少有答案存在。
样例输入
5 10
6 3 2 1 7
样例输出
2 4
数据范围限制
30
30
30%的数据,
1
<
=
N
<
=
100
1<=N<=100
1<=N<=100;
60
60
60%的数据,
1
<
=
N
<
=
1000
1<=N<=1000
1<=N<=1000;
100
100
100%的数据,
1
<
=
N
<
=
100000
,
0
<
=
a
i
<
=
1
0
9
,
0
<
=
T
<
=
2
3
1
−
1
1<=N<=100000, 0<=ai<=10^9,0<=T<=2^31-1
1<=N<=100000,0<=ai<=109,0<=T<=231−1。
提示
要满足连续个总和不超过
10
10
10,有
3
+
2
+
1
3+2+1
3+2+1和
2
+
1
+
7
2+1+7
2+1+7两种可能性,优先输出
2
2
2到
4
4
4个草场。
解题思路
先做一个前缀和,然后暴力,再加一点优化。。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
long long n,t,a[100010],maxn,p,q,i;
int main(){
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
scanf("%d%lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
i=0,maxn=0;
while(i<n-maxn)
{
i++;
for(int j=i+maxn;j<=n;j++)
{
if(a[j]-a[i-1]<=t)
{
maxn=max(maxn,j-i+1);
p=i;
q=j;
}
else
break;
}
}
printf("%d %d",p,q);
}