POJ3273 Monthly Expense
边界,就是边界和思维,怎么有效的判断中间值是大了还是小了,以及准确的找到边界!一个<写成<=就前功尽弃,还特别难找到错误!
1 #include <cstdio> 2 #include <algorithm> 3 const int maxN = 100005; 4 int N, M; 5 int A[maxN]; 6 using namespace std; 7 int main(void) { 8 while (2 == scanf("%d%d", &N, &M)) { 9 int u = 0, l = 0, m, sum, cnt, i; 10 for (int i = 0; i < N; i++) { 11 scanf("%d", &A[i]); 12 u += A[i]; 13 l = max(l, A[i]); 14 } 15 while (u > l) { 16 m = (l+u)>>1; 17 sum = cnt = 0; 18 for (i = 0; i < N; i++) { 19 sum += A[i]; 20 if (sum > m) { 21 cnt++; 22 sum = A[i]; 23 } 24 } 25 if (cnt < M) u = m; 26 else l = m+1; 27 } 28 printf("%d\n", l); 29 } 30 }