POJ-3273(二分)
//题意:给出农夫在n天中每天的花费,要求把这n天分作m组, //每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值。 //思路:看到各组最小和最大的,果断上二分。很好的一道二分穷举的题。 #include <stdio.h> #include <iostream> using namespace std; int a[100005]; int n, m; bool judge(int x){ int cnt = 1, sum = 0; for(int i = 1; i<=n;i++){ if(sum+a[i]<x){ sum= sum+a[i]; } else{ sum = a[i]; cnt++; } } if(cnt>m) return 0; else return 1; } int main(){ cin>>n>>m; int low = 0, high = 0,mid; for(int i = 1; i<=n; i++ ) { cin>>a[i]; low = max(low,a[i]); high+=a[i]; } while(low<high){ mid = (low+high)>>1; if(judge(mid)) high = mid - 1; else low = mid + 1; } printf("%d\n",low); return 0; }