题意:

  现在有一个长度为 n的升序数组 arr 和一个数 x,你需要在 arr 中插入 x

  你可以询问 x 跟 arri 的大小关系,保证所有 arri x 互不相同。这次询问的代价为 costi

  你需要返回 x 应该插入的位置,显然有 n+1 中可能的返回值。

  现在给你 cost 数组,你需要制定方案,使得对于所有可能的情况花费代价(即询问的代价的和)的最大值最小,输出这个最小值。

  制定方案的意思就是说你先询问一个 i,然后根据返回值决定接下来询问哪个 i,直到你可以确定答案为止。

分析:

  这个题好神啊……我看了ztb大爷的代码……可能我理解的也不是很准确啊……那就三个月后再战此题吧……

  首先可以看到,每个ai不超过9,所以最终的答案一定不大,最变态的上界也不过就是9logn,但是应该达不到。

  我们设两个dp数组:

    f[i][v]表示以i为当前区间的左端点,花费为v,最长能确定的区间的右端点

    g[i][v]表示以i为当前区间的右端点,花费为v,最长能确定的区间的左端点。(其实就是对称的)

  那么我们可以看到,对于一个costi,假如我们付出这样的代价,那么在暂时不考虑左端点的情况下,最长的区间的右端点一定在f[i+1][v-costi],那我们该用这个点去更新哪个状态呢???

  即为这个可行区间找一个最左端点,那么我们另一个数组就派上用场了,花费已经确定,那么我们就令:

  f[g[i][v-costi]][v]=max(f[g[i][v-costi]][v], f[i+1][v-costi]);

  或者换一种表达方式,就是在i这个点,我们花costi的花费,使总花费达到v,可以使g[i][v-costi]表示的这个点到f[i+1][v-cost]表示的这个点的区间可行(这段区间最多用v的代价就可以检索到每一个值)

  你看到我们的方程,发现i及i之前有一个花费v-costi达到的最远区间,i之后也是花费v-costi达到的最远区间,会不会两遍加起来的花费就超过了v-costi呢?

  如果你这样想,说明你的理解和这道题的题意真的是阴阳两隔(没错就是我)。

  题目里说的是根据返回的值来调整继续下去的决策,所以说,这一步操作就相当于是,假如我们询问了i,那么返回的参数如果是小于等于ai,我们就走左边那个区间来花掉剩下的v-costi,如果返回值告诉我们,我们的x大于ai,那么我们就往右查找,来花掉剩下的v-costi,根本不存在v-costi花两遍的情况,因为根本不可能既走左边又走右边!

  另一个方程同理:g[f[i+1][v-costi]][v]=min(g[f[i+1][v-costi]][v],g[i][v-costi]);

  当然,初始化就是f[i][v]=g[i][v]=i;

  但是,有些costi由于太过不优,我们决策时会直接跳过,但是它会被之前某些决策所覆盖,所以也是需要更新的,于是就多了两个for循环来保证所有答案合法且最优。

  当f[1][v]覆盖整个区间时,v就是题目的答案。

代码:

 #include<bits/stdc++.h>
using namespace std;
const int N=,M=;
int a[N],f[N][M],g[N][M],n;char s[N];
int main(){
scanf("%s",s+);n=strlen(s+);
for(int i=;i<=n;i++) a[i]=s[i]-'';
for(int v=;v<M;v++)
for(int i=;i<=n+;i++)
f[i][v]=g[i][v]=i;
for(int v=;v<M;v++){
for(int i=;i<=n;i++){
if(v<a[i]) continue;
f[g[i][v-a[i]]][v]=max(
f[g[i][v-a[i]]][v],f[i+][v-a[i]]);
g[f[i+][v-a[i]]][v]=min(
g[f[i+][v-a[i]]][v],g[i][v-a[i]]);
} for(int i=;i<=n+;i++)
f[i][v]=max(f[i][v],f[i-][v]);
for(int i=n;i;i--)
g[i][v]=min(g[i][v],g[i+][v]);
if(f[][v]==n+)
{printf("%d\n",v);return ;}
} return ;
}

dp

  

【2018 1月集训 Day1】二分的代价的更多相关文章

  1. 【2019 1月集训 Day1】回文的后缀

    题意: 给定 n,s,求有多少个字符集大小为 s ,长度为 n 的字符串,使得其不存在一个长度大于 1 的回文后缀. 答案对 m 取模. 分析: 考场见到计数题的链式反应,想写暴力—>暴力难写— ...

  2. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  3. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  4. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  5. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  6. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  7. LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)

    LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...

  8. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  9. 【2018寒假集训 Day1】【位运算】翻转游戏

    翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...

随机推荐

  1. mybatise

    http://www.cnblogs.com/xdp-gacl/p/4261895.html

  2. bzoj 1042: [HAOI2008]硬币购物【dp】

    设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限-3个超限+2个超限-1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去, ...

  3. CF896C Willem, Chtholly and Seniorious(珂朵莉树)

    中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...

  4. 【插件开发】—— 14 Site is incorrect!编辑器启动报错!

    前言 博文纵览 最近在弄编辑器的时候出现了一个十分尴尬的错误!这里收录一下: BUG如下图所示: 目测堆栈,与自己开发的代码无关.完全是Eclipse自己初始化的时候遇到了问题,最头疼的就是这种问题. ...

  5. Spring Boot:关于“No converter found for return value of type: class xxx”的解决方法

    首先在对应的controller中的@RestController中返回json对象的操作 public class HelloController { @RequestMapping("/ ...

  6. 第四代增强 NEW BADI的定义及实现

    NEW BADI 是在第四代增强框架下创建的BADI,是相对于第三代增强Classic Badi 而言的. 根据第四代增强的基本概念,所有显式增强Enhancement options 都必须放在增强 ...

  7. Activiti6.0教程 Service用途剖析 (二)

    这节我们学习下Activiti的7大对象,首先我们从ProcessEngine接口开始看. /* Licensed under the Apache License, Version 2.0 (the ...

  8. 设置mysql 定时备份任务

    1 修改配置文件  /etc/my.conf (为了命令 mysqldump能省略输入密码执行,mysql5.5 之后已经不建议控制台直接输入密码的方式) 增加如下配置 [client]host=lo ...

  9. cenos mkdir 无法创建文件夹,即便文件权限为777

    SELinux 拒绝了httpd的方式去读写此目录 chcon -R -t httpd_sys_content_rw_t /var/www/html

  10. MySQL 一对多查询,合并多的一方的信息

    select   c.name,  (select   group_concat(name) from student   s   where  s.class_id =c.id ) from  cl ...