题目传送门
。
解法:
二分啊。
二分枚举答案然后扫一遍答案就行了呀。
最小值:
如果当前的切题数小于等于k的话。
那么证明不够。所以n应该要更小。往下枚举。
最大值:
如果当前的切题数大于等于k的话
那么证明切题数有多。所以n往大的枚举。
同时如果切题数等于k的话记录答案就好
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll a[110000];
int main() {
int n,k;scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
ll l=1,r=1ll<<63-1,mid,ans=-1;
while(l<=r) {
mid=(l+r)/2;
ll t=0,s=0;
for(int i=1;i<=n;i++) {
t+=a[i];if(t>=mid)t=0,s++;
if(t<0)t=0;
}
if(s<=k) {r=mid-1;if(s==k)ans=mid;}else l=mid+1;
}
if(ans!=-1) {
printf("%lld ",ans);
l=1,r=1ll<<63-1,ans=-1;
while(l<=r) {
mid=(l+r)/2;
ll t=0,s=0;
for(int i=1;i<=n;i++) {
t+=a[i];if(t>=mid)t=0,s++;
if(t<0)t=0;
}
if(s<k) r=mid-1;else {if(s==k)ans=mid;l=mid+1;}
}printf("%lld\n",ans);
}else printf("-1\n");
return 0;
}