POJ 3273
传说中的二分穷举
题意是:农夫每天有一个花费预算,一个n天,把这n天划分成m组,注意,n天的顺序是不能变的。这道题求得是一个划分依据k,每组的最大花费不能超过k,所以,要通过二分来寻找这个值。
上限high是所有的花费,下限low是所有花费中的最大值。有了上下限,就开始二分,在二分的过程中要判断是否是否能够利用mid值来划分出m组如果划分出来的组数大于m的话,增加mid的值
如果小于或者等于m的话,减小mid的值。
网上大牛的代码:
#include <iostream> #include <math.h> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int n,m; bool group(int mid,int money[]) { int sum=0; int group=1; for(int i=0; i<n; i++) { if(sum+money[i]<=mid) { sum+=money[i]; } else { sum=money[i]; group++; } } if(group>m) { return true; } else { return false; } } int main() { while(~scanf("%d%d",&n,&m)) { int *money=new int[n+1]; int low=0; int high=0; for(int i=0; i<n; i++) { scanf("%d",&money[i]); high+=money[i]; if(low<money[i]) { low=money[i]; } } int mid; while(low<=high) { mid=(low+high)/2; if(group(mid,money)) { low=mid+1; } else { high=mid-1; } } printf("%d\n",mid); } return 0; }