二分+前缀和——2021-02-03第一更

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;
} 

前缀和系列

二分系列

猜你喜欢

转载自blog.csdn.net/SSL_wyd/article/details/113578538