|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int m,n;
- const int N=2e5+10;
- int a[N];
- void putin()
- {
- cin>>n>>m;
- for(int i=0;i<n;i++)
- {
- cin>>a[i];
- }
- }
- bool check(ll k)
- {
- ll res =1,cnt=0; //res表示行数
- for(int i=0;i<n;i++)
- {
- if(a[i]>k)return 0; // 9 5 2 8 10 16 18
- else if(a[i]+cnt+1<=k)cnt+=a[i]+1;
- else if(cnt+a[i]<=k) res++,cnt=0; //表示到了26没有空格
- else res++,cnt=a[i]+1;//表示这段放不下需要另外启动一行,
-
- }
- return res-(!cnt)<=m; //以res=1开始的,如果没有
-
- }
- void min()
- {
- ll l=0,r=1e15;
- while(l<r)
- {
- ll mid=l+r>>1;
- if(check(mid))r=mid;
- else l=mid+1;
- }
- cout<<r<<endl;
- }
- int main()
- {
- ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
- putin();
- min();
-
- }
复制代码
为什么return res-(!cnt)<=m;为什么要减去取反的cnt呢 |
|