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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; typedef long long ll;
const int MAXN = 512;
int a[MAXN], board[MAXN], n, k; bool judge(ll key)
{
ll num = 1, sum = 0;
REP(i, 0, n)
{
if(sum + a[i] <= key) sum += a[i];
else
{
num++; sum = a[i];
if(num > k) return false;
}
}
return true;
} void print(ll key)
{
memset(board, 0, sizeof(board));
ll sum = 0, remain = k;
for(int i = n - 1; i >= 0; i--)
{
if(sum + a[i] > key || i + 1 < remain)
sum = a[i], board[i+1] = 1, remain--;
else sum += a[i];
} printf("%d", a[0]);
REP(i, 1, n)
{
if(board[i]) printf(" /");
printf(" %d", a[i]);
}
puts("");
} int main()
{
int T;
scanf("%d", &T); while(T--)
{
ll l = 0, r = 0;
scanf("%d%d", &n, &k);
REP(i, 0, n)
scanf("%d", &a[i]), r += a[i], l = max(l, (ll)a[i]); l--;
while(l + 1 < r)
{
ll mid = (l + r) / 2;
if(judge(mid)) r = mid;
else l = mid;
} print(r);
} return 0;
}


紫书 例题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. C# 基础复习 四 多线程

    单线程和多线程的区别     单线程:         只用主线程处理,如果一个操作在占用主线程,那么其他操作则无法执行     多线程:         除了主线程外,还开启了子线程来执行操作,子线 ...

  2. Vue学习之路第九篇:双向数据绑定 v-model指令

    1.学习准备: ①:双向数据绑定可以简单理解为:后端定义的数据改变,前端页面展示的时候会自动改变,数据通过前端页面修改的时候,后端定义的数据内容也会随之改变. ②:指令中只有v-model可以实现双向 ...

  3. input只能输入数字或两位小数

    /** * [只能输入数字和两位小数] * 举例:<input type="text" onkeyup="num(this)" size="10 ...

  4. jquery 终止循环

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  5. 使用PoolingHttpClientConnectionManager解决httpclient的多线程请求问题

    直接上代码 1.主程序 public class TestMain { public static void main(String[] args) throws NSQException, Time ...

  6. java类的方法

    我前面说的都是类的属性,现在说类的方法: 类{ 属性:“类有什么” 方法:“类能做什么” } 首先我们在之前创建的学生类中添加个打印1-10数字的方法,参数是name package cuteSnow ...

  7. Maven系列--web.xml 配置详解

    一 .web.xml介绍 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 紧接着,容 ...

  8. 数人云CTO解读Docker 1.12和金融业容器化

    7月29日 数人云 在上海举办金融沙龙,邀请上交所和近二十家来自银行.保险.证券的IT技术专家一同探讨容器技术在金融业中的最佳实践.数人云CTO肖德时在会上将传统金融行业通过容器可以解决的四大问题做了 ...

  9. [Javascript] Delegate JavaScript (ES6) generator iteration control

    We can execute generators from generators, and delegate the iteration control with the yield* keywor ...

  10. 电脑显示U盘,可是读取不了

    问题: 我的一个内存卡没用,放到了读卡器上.刚開始能用,可是到了后来,突然之间发现: 插入读卡器之后,仅仅是在U下角显示有有U盘提示,提示"打开设备和打印"或者"安全删除 ...