-
Monthly Expense
- OpenJ_Bailian - 4135
-
最大值最小化:
-
我们假设x为最小的最大值,那么x-1是不满足条件的,x+1是满足条件的。但他不满足最小,
-
假设我们左边界是L,右边界是R,我们二分一个答案ans,ans为第一个满足条件的数
-
题意:共n个月,给出每个月的开销.将n个月划分成m个时间段,求m个时间段中开销最大的时间段的最小开销值。
-
思路:二分答案,答案可能范围为单个最大值——所有值的sum,不断二分去把最大值最小化
-
check检验这种最大值情况符不符合:如果连续求和过程中超过了当前枚举的答案那么久cnt++,now=0;
-
最终看看能不能在题目给定的m次之内把他们都合法的分开。
-
#include<bits/stdc++.h> using namespace std; vector<int>a; int n,m,l,x,r; bool check(int mid) { int cnt=0,now=0; for(int i=0; i<n; i++) { if(a[i]>mid)return 0; if(now+a[i]>mid) { cnt++; now=0; } now+=a[i]; } return cnt<m; } int main() { scanf("%d%d",&n,&m); a.clear(); r=0,r=0; for(int i=0; i<n; i++) { scanf("%d",&x); a.push_back(x); r+=a[i]; l=max(l,a[i]); } while(l<r) { int mid=(l+r)/2; if(check(mid))r=mid; else l=mid+1; } cout<<l<<endl; return 0; }
Monthly Expense OpenJ_Bailian - 4135 -二分答案-(最大值最小化)
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/83926821
今日推荐
周排行