poj 3273 Monthly Expense 二分
题目链接:http://poj.org/problem?id=3273
因为规定天数连续 所以从前到后贪心即可 裸二分
二分专题的特点:
1.很容易写
2.很容易写错
所以要注意:
上下界的取值是否太大太小 加起来会不会爆
最后能不能跳出循环
当对中值进行判定以后 应该如何调整lb和ub
注意lb那个地方应该赋值为mid+1 否则会T到死
#include <cstdio> #include <cstdlib> #include <ctime> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <set> #include <queue> #include <vector> using namespace std; typedef long long ll; const int maxn = 100010; const double eps = 1e-7; int a[maxn]; int main() { //freopen("in.txt", "r", stdin); int n, m; scanf("%d%d", &n, &m); int maxnum = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); maxnum = max(maxnum, a[i]); } int ub = 0x3fffffff; int lb = maxnum; while(ub > lb) { int mid = (ub + lb) / 2; int cnt = 0; int sum = 0; for(int i = 0; i < n; i++) { if(sum + a[i] > mid) { cnt++; sum = a[i]; continue; } sum += a[i]; } cnt++; if(cnt <= m) ub = mid; else lb = mid + 1; } printf("%d\n", ub); return 0; }