【洛谷习题】数列分段
题目链接:https://www.luogu.org/problemnew/show/P1182
看到题目的问法,就觉得这一般是一道二分答案的问题。然后写了一下发现写起来还是挺容易的,然后就全WA了,沙比一般没有把cnt初始化为1,就少了一段。
然后一修改,就80分了,很懵逼啊那一个点,看了别人的分析才知道,判断的时候并不能只是一段一段加,加超了就换一段,可能某个元素大于要判断的x,加上直接就错了。
可见二分答案的题目也要好好考虑,毕竟这类题目最关键的就在于验证过程。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步