T1 批改作业
题目:
现在有 n 位同学上交了作业,每位同学的作业本上都完成了数量不等的习题,由于时间有限,老师只能批改连续的作业,而且不超过 m 道题,还要尽可能多改几个同学的作业。 现在,请你帮助老师决定,要批改哪一段同学的作业。
输入
第一行,包含两个正整数n和m。
第二行包含n个用空格隔开的数,第i个数表示第i个同学完成的习题数。
输出
一行,共两个数,表示批改的起点和终点编号,中间用空格分开。批改的方向总是从编号小的到编号大的。另外,若有长度相同的,输出起点编号较小的答案。数据保证至少有答案存在。
输入样例
5 10
6 3 2 1 7
输出样例
2 4
思路
这道题目我一开始做的时候不会二分,就暴力for套for,然后就TLE了5个点。后来学了二分,就用二分查找去找以当前这个数为起点,可以批改的最多作业,再去比较是不是最多的,就可以了,这里用上昨天说过的upper_bound函数来做。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],x,h,z,y;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>x;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
a[i]=a[i-1]+t;
}
for(int i=1;i<=n;i++)
{
long long p=upper_bound(a+1,a+1+n,a[i-1]+x)-a;
if(p-i>h)
{
h=p-i;
z=i;
y=p-1;
}
}
cout<<z<<" "<<y;
return 0;
}