【洛谷习题】数列分段
题目链接: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 }