poj3273 Monthly Expense (二分,最大值最小化)
题意:将N个账款分割成M个财务期,使得每个分期账款和的最大值最小。
题解:贪心思想,二分法。上界为N天花费总和,下界为每天花费的最大值。根据mid值遍历n天花费看是否满足M各财务期条件
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int main(){ 5 int n,m,i,cnt,a[100001],ma=0,s=0; 6 scanf("%d%d",&n,&m); 7 for(i=0;i<n;++i){ 8 scanf("%d",&a[i]); 9 ma=max(a[i],ma); 10 s+=a[i]; 11 } 12 int l=ma,r=s,mid; 13 while(l<r){ 14 mid=(l+r)>>1; 15 cnt=1; 16 for(s=i=0;i<n;++i){ 17 s+=a[i]; 18 if(s>mid){cnt++;s=a[i];} 19 } 20 if(cnt<=m) r=mid; 21 else l=mid+1; 22 } 23 printf("%d\n",l); 24 return 0; 25 }