【洛谷习题】数列分段

题目链接:https://www.luogu.org/problemnew/show/P1182


看到题目的问法,就觉得这一般是一道二分答案的问题。然后写了一下发现写起来还是挺容易的,然后就全WA了,沙比一般没有把cnt初始化为1,就少了一段。

然后一修改,就80分了,很懵逼啊那一个点,看了别人的分析才知道,判断的时候并不能只是一段一段加,加超了就换一段,可能某个元素大于要判断的x,加上直接就错了。

可见二分答案的题目也要好好考虑,毕竟这类题目最关键的就在于验证过程。

 1 #include <cstdio>
 2 
 3 const int maxn = 1e5 + 5;
 4 
 5 int n, m, num[maxn];
 6 
 7 inline int check(int x) {
 8     int cnt = 1, sum = 0;
 9     for (int i = 1; i <= n; ++i) {
10         if (num[i] > x) return 0; //注意这里!!!
11         sum += num[i];
12         if (sum > x) {
13             sum = num[i];
14             ++cnt;
15         }
16     }
17     if (cnt > m) return 0;
18     else return 1;
19 }
20 
21 int main() {
22     scanf("%d%d", &n, &m);
23     int l = 1, r = 0, mid;
24     for (int i = 1; i <= n; ++i) {scanf("%d", &num[i]);r += num[i];}
25     while (l < r) {
26         mid = l + (r - l) / 2;
27         if (check(mid)) r = mid;
28         else l = mid + 1;
29     }
30     printf("%d", l);
31     return 0;
32 }
AC代码
原文地址:https://www.cnblogs.com/Mr94Kevin/p/9776053.html