zoukankan      html  css  js  c++  java
  • 【洛谷习题】数列分段

    题目链接: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代码
  • 相关阅读:
    第五周作业
    2019春第四周作业编程总结
    2019春第四周作业
    2019春第二周作业编程总结
    2019春第一周作业编程总结
    自我认识
    对我影响最大的三位老师
    C语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9776053.html
Copyright © 2011-2022 走看看