Monthly Expense OpenJ_Bailian
阿新 • • 發佈:2018-12-20
-
Monthly Expense
-
最大值最小化:
-
我們假設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; }