A. 这个数组不想被划分(二分答案,大一期末考核)
题目来源:https://codeforces.com/gym/547381/problem/A
//
题意:给定n长的数字串,然后分为k个子数组(连续的),怎么分(每个元素都要被分),每个子序列的和的最大值最小。
//
思路:“赛时没有想出来,很典的一道二分答案”,二分最优答案,check是枚举数组,贪心分子序列,保证每个子序列都<=mid。
//
代码:
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+9;
int n,k;
vector<int>a(N);
int check(int x){//枚举a,每个子区间的和控制在<=k
int ans=0,sum=0;
for(int i=1;i<=n;i++){
if(a[i]>x){return 0;}//一个区间都包含不了
if(sum+a[i]<=x){
sum+=a[i];
}
else{
ans++;
sum=a[i];
}
}
if(sum!=0){ans++;}
if(ans<=k){return 1;}
else{return 0;}
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=5e15+9,ans;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){//mid够,找更小的优
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
cout<<ans<<endl;
return 0;
}
浙公网安备 33010602011771号