Part2.3 P4343 自动刷题机 【二分答案】
原题链接:P4343 [SHOI2015]自动刷题机 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:求符合要求的最大值和最小值,即 cnt == k
思路:两个二分答案分别求最大最小,记得特判没有答案得情况
评价:二分板子
1 #include2 using namespace std; 3 //#define mod 1000000007 4 typedef long long ll; 5 ll n,k,a[100005],ans=0; 6 bool check1(ll mid) 7 { 8 ll cnt=0,sum=0; 9 for(int i=1;i<=n;i++) 10 { 11 sum+=a[i]; 12 if(sum>=mid) 13 { 14 cnt++; 15 sum=0; 16 } 17 if(sum<=0) sum=0; 18 } 19 if(cnt==k) ans=1; 20 return cnt>=k; 21 } 22 bool check2(ll mid) 23 { 24 ll cnt=0,sum=0; 25 for(int i=1;i<=n;i++) 26 { 27 sum+=a[i]; 28 if(sum>=mid) 29 { 30 cnt++; 31 sum=0; 32 } 33 if(sum<=0) sum=0; 34 } 35 if(cnt==k) ans=1; 36 return cnt<=k; 37 } 38 int main() 39 { 40 scanf("%lld%lld",&n,&k); 41 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); 42 ll l=1,r=1e18,al,ar; 43 while(l<r) 44 { 45 ll mid=(l+r)/2; 46 if(check2(mid)) r=mid; 47 else l=mid+1; 48 } 49 al=l; 50 //printf("%lld %lld\n",l,r); 51 l=1,r=1e18; 52 while(l<r) 53 { 54 ll mid=(l+r+1)/2; 55 if(check1(mid)) l=mid; 56 else r=mid-1; 57 } 58 ar=r; 59 if(ans) printf("%lld %lld",al,ar); 60 else printf("-1"); 61 return 0; 62 }