G - ATM and Students
G - ATM and Students
有n个学生来ATM机操作,有的取钱,有的存钱,现在ATM机里面有s元,求最多能有多少个学生可以操作,输出最多学生可操作的学生区间的最左端和最右端。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
long long int l_,r_,a[1000000];//l_为最终左区间的位置,r_为最终右区间的位置
while(t--)
{
long long int n,s;cin>>n>>s;
for(int i=0;i<n;i++) cin>>a[i];
long long int sum=0,ans=-1,r=-1;//ans为左右区间的距离,r为临时右端点的位置
for(int i=0;i<n;i++)
{
if(r<i){
r = i;sum=a[i];
}
while(r<n&&s+sum>=0)//寻找合适的区间并更新左右端点
{
if(r-i+1>ans)//i为暂时的左端点
{
ans=r-i+1;l_=i;r_=r;
}
r++;sum+=a[r];
}
if(r<n)//回退
{
sum-=a[r];r--;
}
else break;
sum-=a[i];//回退
}
if(ans==-1)//无符合条件的区间
cout<<-1<<endl;
else
cout<<l_+1<<' '<<r_+1<<endl;
}
}