这道题让最大值最小, 显然是二分答案

当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案

为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点

就全部枚举一遍, 验证答案。但是因为答案满足单调性, 可以用二分的方法

来”枚举“, 复杂度可以从n降到logn


开始我自己写了一个, 但是WA, 后来看了刘汝佳的代码, 发现要注意三点

(1)这道题的和的最大值会爆int, 要用long long。

养成看到题目的时候计算最大值看会不会爆int的习惯(int最大大概是2乘10的9次方)

(2)输出的时候,因为是前面的子序列的和尽量小, 所以我自己写的时候想到了从后

往前尽量取(贪心)来输出, 但是没有考虑到分成固定要分成k个。 所以要专门用一个remain

来控制分成子序列的个数, 不然子序列会分少。
(3) 二分开始时候的左端点一定要设为元素最大值, 我一开始有想到, 但是觉得好像

对答案没有什么影响, 就懒得去求最大值, 就直接设为0, 然后就WA了。

事实上, 在判断这个答案是否符合的时候(我的程序中的judge函数),这个key值

根本就小于元素的时候, 是可以通过的, 这个错误是非常难发现的, 所以要提前

处理, 也就是在一开始的时候最小的可能的答案就设为元素最大值

顺便提一下, 我的程序中l--, 是因为我的二分的写法是这么写的。


  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define REP(i, a, b) for(int i = (a); i < (b); i++)
  5. using namespace std;
  6. typedef long long ll;
  7. const int MAXN = 512;
  8. int a[MAXN], board[MAXN], n, k;
  9. bool judge(ll key)
  10. {
  11. ll num = 1, sum = 0;
  12. REP(i, 0, n)
  13. {
  14. if(sum + a[i] <= key) sum += a[i];
  15. else
  16. {
  17. num++; sum = a[i];
  18. if(num > k) return false;
  19. }
  20. }
  21. return true;
  22. }
  23. void print(ll key)
  24. {
  25. memset(board, 0, sizeof(board));
  26. ll sum = 0, remain = k;
  27. for(int i = n - 1; i >= 0; i--)
  28. {
  29. if(sum + a[i] > key || i + 1 < remain)
  30. sum = a[i], board[i+1] = 1, remain--;
  31. else sum += a[i];
  32. }
  33. printf("%d", a[0]);
  34. REP(i, 1, n)
  35. {
  36. if(board[i]) printf(" /");
  37. printf(" %d", a[i]);
  38. }
  39. puts("");
  40. }
  41. int main()
  42. {
  43. int T;
  44. scanf("%d", &T);
  45. while(T--)
  46. {
  47. ll l = 0, r = 0;
  48. scanf("%d%d", &n, &k);
  49. REP(i, 0, n)
  50. scanf("%d", &a[i]), r += a[i], l = max(l, (ll)a[i]);
  51. l--;
  52. while(l + 1 < r)
  53. {
  54. ll mid = (l + r) / 2;
  55. if(judge(mid)) r = mid;
  56. else l = mid;
  57. }
  58. print(r);
  59. }
  60. return 0;
  61. }


紫书 例题8-10 UVa 714 (二分答案)的更多相关文章

  1. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)

    这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...

  2. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  3. 紫书 例题 9-5 UVa 12563 ( 01背包变形)

    总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...

  4. 紫书 例题8-12 UVa 12627 (找规律 + 递归)

    紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...

  5. 紫书 例题8-4 UVa 11134(问题分解 + 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  6. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  7. 紫书 例题7-14 UVa 1602(搜索+STL+打表)

    这道题想了很久不知道怎么设置状态,怎么拓展,怎么判重, 最后看了这哥们的博客 终于明白了. https://blog.csdn.net/u014800748/article/details/47400 ...

  8. 紫书 例题8-8 UVa 1471 (用set实现动态二分)

    设切割的区间为(j, i), 注意两边都是开区间. 然后可以预处理出以i为起点的最长连续递增的长度和以j为终点的最长连续递增的长度. 大致思路就是枚举i,右边这一侧的最优值就知道了, 然后这道题的关键 ...

  9. 紫书 例题8-14 UVa 1607 (二分)

    题意非常难理解-- #include<cstdio> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namesp ...

随机推荐

  1. luoguP1002

    p1002 题意: 从坐标A到坐标B的可能路线(有一些点不能走)情况,很明显可以看出用dp做 m[i][j]=m[i-1][j]+m[i][j-1](注意处理不能走的点) 自己在初始化时犯了错,第1行 ...

  2. Jetty初探

    一.在jetty中部署web应用 Jetty 和 Tomcat 一样都是一个web server的container, 用户可以在里面 deploy 自己的 war 包,然后启动 Jetty, 进而通 ...

  3. js如何实现php的in_array()

    var arr = [ 4, "Pete", 8, "John" ]; jQuery.inArray("John", arr); //3 j ...

  4. linux部分常用命令

    linux的命令挺多的,下面是我常用的,其实也不可能在敲代码的时候把这个博客拿出来对着写,就是想记录一下,刚开始都觉得不好记,多敲几遍就记住了!!! 创建文件夹:mkdir filename 删除当前 ...

  5. JStorm中的并行( parallelismction )介绍

    JStorm中的并行( parallelismction )介绍 JStrom中.一个计算任务通过多台机器使得计算分解为多个独立并行执行在集群内执行的任务(tasks).从而得到水平扩展. JStor ...

  6. UI自动化

    1.下载安装JDK,配置环境变量 2.下载eclips,并安装 3.下载jskuli截图工具,并安装 4.下载Jspec插件,将其放在eclipse路径下的\plugins文件夹中.(打开eclips ...

  7. React-Native系列Android——Native与Javascript通信原理(一)

    React-Native最核心的是Native与Javascript之间的通信,并且是双向通信.Native层到Javascript层,Javascript层到Native层.虽说是两个方向,但实现上 ...

  8. Hive编程指南_学习笔记01

    第四章: HQl的数据定义 1:创建数据库   create database financials;   create database  if not exists financials; 2: ...

  9. lscript.ld 链接器脚本

    sumary选项卡 lscript.ld是这个应用程序的链接器脚本. 这是实用的作为一个报告 看看内存是针相应用程序. 它也能够被编辑以改变应用程序的位置.双击Hello_Zynqàsrcà lscr ...

  10. How To Do @Async in Spring--转

    原文地址:http://www.baeldung.com/spring-async 1. Overview In this article, we’ll explore the asynchronou ...