zoukankan      html  css  js  c++  java
  • luogu P4343 [SHOI2015]自动刷题机 |二分答案

    题目描述
    曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机——一种可以自动 AC 题目的神秘装置。

    自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷题机的代码生成模块会有两种可能的结果:

    1.写了xx行代码

    2.心情不好,删掉了之前写的yy行代码。(如果yy大于当前代码长度则相当于全部删除。)

    对于一个 OJ,存在某个固定的长度n>0n>0,一旦自动刷题机在某秒结束时积累了大于等于nn行的代码,它就会自动提交并 AC 此题,然后新建一个文件(即弃置之前的所有代码)并开始写下一题。SHTSC 在某个 OJ 上跑了一天的自动刷题机,得到了很多条关于写代码的日志信息。他突然发现自己没有记录这个 OJ 的nn究竟是多少。所幸他通过自己在 OJ 上的 Rank 知道了自动刷题机一共切了kk道题,希望你计算nn可能的最小值和最大值。

    输入格式
    第一行两个整数ll,kk,表示刷题机的日志一共有ll行,一共了切了kk题。

    第二行ll个整数x_i≥0表示写了x_i行代码,x_i<0代表删除了这道题的-x_i行代码。

    输出格式
    输出两个数aa,bb,分别代表nn可能的最小值和最大值。如果不存在这样的nn则输出-1−1。


    #include<queue>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define int long long
    using namespace std;
    const int N=1e5+100;
    ll a[N];
    int l,k;
    bool Mincheck(int x){
    	int now=0,ans=0;
    	for(int i=1;i<=l;i++){
    		now+=a[i];
    		if(now>=x)ans++,now=0;
    		now=max((ll)0,now);
    	}
    	if(ans<=k)return 1;
    	else  return 0;
    }
    bool Maxcheck(int x){
    	int now=0,ans=0;
    	for(int i=1;i<=l;i++){
    		now+=a[i];
    		if(now>=x)ans++,now=0;
    		now=max((ll)0,now);
    	}
    	if(ans>=k)return 1;
    	else  return 0;
    }
    signed main(){
    	cin>>l>>k;
    	int Max=0;
    	for(int i=1;i<=l;i++){
    		scanf("%lld",&a[i]);
    		Max+=abs(a[i]);
    	}
    	if(l<k){
    		cout<<-1<<endl;
    		return 0;
    	}
    	int l=1,r=Max,ans=-1;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		if(Mincheck(mid)){
    			r=mid-1;
    			ans=mid;
    		}else{
    			l=mid+1;
    		}
    	}
    	if(ans==-1){
    		printf("-1
    ");
    		return 0;
    	}
    	int op=ans;
    	ans=-1;
    	l=1,r=Max;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		if(Maxcheck(mid)){
    			l=mid+1;
    			ans=mid;
    		}else{
    			r=mid-1;
    		}
    	}
    	if(ans<op){
    		cout<<-1<<endl;
    		return 0;
    	}else
    	cout<<op<<' '<<ans<<endl;
    }
    
  • 相关阅读:
    最长回文子串(马拉车)
    ubutun 启动/停止/重启MySQL数据库
    臭大佬_LZW
    Beauty Contest(求凸包最大直径)
    Smallest Bounding Rectangle(最小面积外接矩形)
    Triangle(求凸包最大内接三角形)
    P4196 [CQOI2006]凸多边形
    P4724 【模板】三维凸包(简洁)
    P2600 [ZJOI2008]瞭望塔【半平面交】
    退役记
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11853769.html
Copyright © 2011-2022 走看看