首页 > 其他 > 详细

【二分答案】P4343 [SHOI2015]自动刷题机

时间:2021-09-15 11:36:46      阅读:48      评论:0      收藏:0      [点我收藏+]

记录一道二分答案水题。。。


二分答案的一道板子题吧。关键在于while(l<=r),然后用一个ans来专门记录答案,L=mid+1,R=mid-1,最后想要找到答案最大值或者答案最小值,就在ans>=k l=N+1或者ans<=k r=N-1中来记录答案从而来得到二分答案的结果。

点击查看代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<bitset>
#include<queue>
#include<vector>
#include<cstdio>
#include<set>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
const ll maxn = 1e5+5;
ll L,K;
ll X[maxn];
ll N;
ll isok() {
	ll ti = 0;
	ll now = 0;
	for(int i=1;i<=L;i++) {
		now += X[i];
		now = max(0ll,now);
		if(now>=N) {
			now = 0;
			ti++;
		}
	}
	return ti;
}
int main(){
	scanf("%lld%lld",&L,&K);
	ll yo = 0; bool fl = 0;
	for(int i=1;i<=L;i++) {
		scanf("%lld",&X[i]);
		if(X[i]>0) fl = 1;
	}
	ll l=1,r=1e18;
	ll ans1=-1,ans2=-1;
	while(l<=r) {
		N = (l+r)>>1;
		ll ans = isok();
		if(ans<=K) {
			r = N-1;
			if(ans==K) ans1=N;
		} else l = N+1;
	}
	l = 1 , r = 1e18;
	while(l<=r) {
		N = (l+r)>>1;
		ll ans = isok();
		if(ans>=K) {
			l = N+1;
			if(ans==K) ans2=N;
		} else r = N-1;
	}
	if(ans1==-1) puts("-1");
	else printf("%lld %lld\n",ans1,ans2);
	return 0;
}

【二分答案】P4343 [SHOI2015]自动刷题机

原文:https://www.cnblogs.com/newuser233/p/15270160.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!