1 solutions
-
1
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; LL a[N]; LL n,k; bool check(LL mid) { LL s=a[1],cnt=1; //第一段 for(int i=2;i<=n;i++) //枚举每个样本 { if(s+a[i]+1<=mid) //可以放到当前段 { s+=a[i]+1; } else //新开一段 { s=a[i]; cnt++; } } if(cnt<=k) return true; return false; } int main() { cin>>n>>k; LL l=0,r=n; //下界是最高的样板长度,上界是总和 for(int i=1;i<=n;i++) { cin>>a[i]; l=max(l,a[i]); r+=a[i]; } while(l<r) { LL mid=l+r>>1; if(check(mid)) r=mid;//说明mid可以,且答案一定在mid或mid左边 else l=mid+1; //说明mid不可以,答案一定在mid右边 } cout<<l; return 0; }
- 1
Information
- ID
- 1941
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 16
- Accepted
- 4
- Uploaded By