4590: [Shoi2015]自动刷题机
2017-10-25 21:12
267 查看
题目链接
题目大意:有一种自动刷题机。每秒,有两种可能的结果:写了x行代码,或删掉了之前写的y行代码。(如果y大于当前代码长度则相当于全部删除。)一旦自动刷题机在某秒结束时积累了大于等于n行的代码,它就会自动AC一题,然后新建一个文件开始写下一题。知道共切了k道题。求n可能的最小值和最大值。
题解:答案具有单调性,二分
需要注意的是二分成立的条件并非刷题数=k,这样即使能够二分出答案也不一定是合法解,需要带回去检验一下
我的收获:注意二分判断无解的条件,应该带回去检验一下
题目大意:有一种自动刷题机。每秒,有两种可能的结果:写了x行代码,或删掉了之前写的y行代码。(如果y大于当前代码长度则相当于全部删除。)一旦自动刷题机在某秒结束时积累了大于等于n行的代码,它就会自动AC一题,然后新建一个文件开始写下一题。知道共切了k道题。求n可能的最小值和最大值。
题解:答案具有单调性,二分
需要注意的是二分成立的条件并非刷题数=k,这样即使能够二分出答案也不一定是合法解,需要带回去检验一下
我的收获:注意二分判断无解的条件,应该带回去检验一下
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <queue> using namespace std; #define INF 1e15 const int M=100005; int n,k; int a[M]; long long mi,mx; int check(long long limit) { long long has=0;int cnt=0; for(int i=1;i<=n;i++){ has+=a[i];has=max(has,0ll); if(has>=limit) cnt++,has=0; } return cnt; } void binary_search_left() { long long l=1,r=INF,mid; while(l<=r){ mid=l+r>>1; if(check(mid)<=k) mi=mid,r=mid-1; else l=mid+1; } } void binary_search_right() { long long l=1,r=INF,mid; while(l<=r){ mid=l+r>>1; if(check(mid)>=k) mx=mid,l=mid+1; else r=mid-1; } } void print_ans() { if(check(mi)!=k||check(mx)!=k) puts("-1"); else cout<<mi<<" "<<mx<<endl; } void work() { binary_search_left(); binary_search_right(); print_ans(); } void init() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); } int main() { init(); work(); return 0; }
相关文章推荐
- BZOJ 4590 [Shoi2015]自动刷题机
- bzoj4590 [Shoi2015] 自动刷题机
- 【bzoj4590】[Shoi2015]自动刷题机
- 4590: [Shoi2015]自动刷题机
- 【BZOJ】4590 [Shoi2015]自动刷题机
- BZOJ 4590: [Shoi2015]自动刷题机
- bzoj4590 [Shoi2015]自动刷题机
- bzoj 4590: [Shoi2015]自动刷题机
- bzoj 4590: [Shoi2015]自动刷题机
- COGS2642 / Bzoj4590 [Shoi2015]自动刷题机
- 【bzoj4590】【SHOI2015】【自动刷题机】【二分答案】
- bzoj 4590: [Shoi2015]自动刷题机
- BZOJ 4590: [Shoi2015]自动刷题机
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
- [二分] BZOJ 4590 [Shoi2015]自动刷题机
- BZOJ4590 [Shoi2015]自动刷题机
- BZOJ4590: [Shoi2015]自动刷题机
- [bzoj]4590: [Shoi2015]自动刷题机
- BZOJ4590 SHOI2015自动刷题机(二分答案)