P4343-[SHOI2015]自动刷题机【二分答案】
生活随笔
收集整理的這篇文章主要介紹了
P4343-[SHOI2015]自动刷题机【二分答案】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目鏈接:https://www.luogu.org/problem/P4343
題目大意
nnn個(gè)操作每個(gè)操作加幾行代碼或減幾行代碼,若代碼積累到xxx行就自動(dòng)刪除所有代碼并切掉一道題。
已知道切掉了kkk題,求最大和最小的xxx
解題思路
因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">xxx和切題的數(shù)量單調(diào),所以可以二分答案即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=100010; ll n,k,a[N],sum,maxs,l,r; bool check(ll x) {ll now=0,z=0; for(ll i=1;i<=n;i++){now+=a[i];now=max(now,0ll);if(now>=x) z++,now=0;}return (z>=k); } bool check2(ll x) {ll now=0,z=0; for(ll i=1;i<=n;i++){now+=a[i];now=max(now,0ll);if(now>=x) z++,now=0;}return (z<=k); } bool checks(ll x) {ll now=0,z=0; for(ll i=1;i<=n;i++){now+=a[i];now=max(now,0ll);if(now>=x) z++,now=0;}return (z==k); } int main() {scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),sum+=a[i],maxs=max(maxs,sum);l=1;r=(1e9)*n;while(l<=r){ll mid=(l+r)/2;if(check2(mid)) r=mid-1;else l=mid+1;}if(checks(l))printf("%lld ",l);else {printf("-1");return 0;}l=1;r=(1e9)*n;while(l<=r){ll mid=(l+r)/2;if(check(mid)) l=mid+1;else r=mid-1;}if(checks(r))printf("%lld",r);else printf("-1"); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的P4343-[SHOI2015]自动刷题机【二分答案】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod-猴猴的比赛【莫队,线段树】
- 下一篇: P5253-丢番图【数论】