POJ 3273 Monthly Expense
题目大意:
给N个数,分成M组,每一组最大值的最小值是多少。每一组数必须是连续的。
解题思路:
用二分法来穷举最大值,求最小。是针对最大值的上界和下界二分。
下面是代码:
#include <stdio.h> int a[100005],n,m; bool does(int xian) { int sum=0,cnt=1; for(int i=0; i<n; i++) { if(sum+a[i]<=xian) { sum+=a[i]; } else { cnt++; sum=a[i]; } } if(cnt>m)return false; return true; } int main() { int i,high=0,low=0,mid; scanf("%d%d",&n,&m); for(i=0; i<n; i++) { scanf("%d",&a[i]); high+=a[i]; if(a[i]>low) { low=a[i]; } } while(low<high) { mid=(low+high)>>1; if(does(mid)) { high=mid-1; } else { low=mid+1; } } printf("%d\n",low); return 0; }