P4343-[SHOI2015]自动刷题机【二分答案】
生活随笔
收集整理的這篇文章主要介紹了
P4343-[SHOI2015]自动刷题机【二分答案】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problem/P4343
題目大意
nnn個操作每個操作加幾行代碼或減幾行代碼,若代碼積累到xxx行就自動刪除所有代碼并切掉一道題。
已知道切掉了kkk題,求最大和最小的xxx
解題思路
因為xxx和切題的數量單調,所以可以二分答案即可。
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"); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的P4343-[SHOI2015]自动刷题机【二分答案】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod-猴猴的比赛【莫队,线段树】
- 下一篇: 白蜡树的种植方法和注意事项 详解白蜡树的