D - Pearls HDU - 1300 斜率dp+二分
D - Pearls
这个题目也是一个比较裸的斜率dp,依照之前可以推一下这个公式,这个很好推
这个注意题目已经按照价格升序排列序,所以还是前缀和还是单调的。
sum[i] 表示前面 i 种珍珠的花费的前缀和
dp[i]表示买前面 i 种珍珠需要的最少的花费
dp[i]=min(dp[j]+(sum[i]-sum[j]+10)*c[i]
j>k 如果要求选 j 更优,则需要满足下列式子
dp[j]+(sum[i]-sum[j]+10)*c[i]<dp[k]+(sum[i]-sum[j]+10)*c[i]
上面式子化简可得
dp[j]-dp[k]<c[i]*(sum[j]-sum[k])
令G[j,k]=(dp[j]-dp[k])/(sum[j]-sum[k])
如果G[j,k]<c[i]且j>k 则选 j 比选 k 更优
推出这个斜率的式子之后,然后要用它。
关键的来了:现在从左到右,还是设k<j<i,如果g[i,j]<g[j,k],那么j点便永远不可能成为最优解,可以直接将它踢出我们的最优解集。为什么呢?
分三种情况讨论
1 G[i,j]<G[j,k]<c[t] 那么 i 是比 j 更优的 所以可以排除 j 点
2 G[i,j]<c[t]<G[j,k] 那么 i 也是比 j 更优的,而且 k 比 j 也优 可以排除 j 点
3 c[t]<G[i,j]<G[j,k] 那么 k 是比 j 更优 可以排除 j 点
所以如果是G[i,j]<G[j,k] 且 i>j>k 那么就可以排除掉 j 这个情况,因为 j 两边永远可以找到一个比它更优的,这个也是一种优化
那如果 G[i,j]>G[j,k] i>j>k 这种情况呢?
1 G[i,j]>G[j,k] >c[t] 那么 j 比 i 更优 k 比 j 更优
2 G[i,j]>c[t]>G[j,k] 那么 j 比 i 更优 j 也比 k 更优
3 c[t]>G[i,j]>G[j,k] 那么 i 比 j 更优 j 比 k 更优
这个就可以找到单调性了,
如果 i 从小往大 G[i,j] 越来越大,那么在 小于等于 c[t] 的范围内,情况也更优,
意思是 如果 i>j>k 如果可以在 j 点取得最优解,那么k点肯定可以排除,
所以就是找小于 c[t] 的最大的这个 j 。
如果是G[i,j]<Gj,k]&&i>j>k 这种情况可以找到一个 j 比两端都优的
因为这个题目c是单调递增的,所以可以用单调队列来维护。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 1e3 + ;
typedef long long ll;
ll dp[maxn], sum[maxn], c[maxn];
int que[maxn]; ll up(int i,int j)
{
return dp[i] - dp[j];
} ll down(int i,int j)
{
return sum[i] - sum[j];
} ll DP(int i,int j)
{
return dp[j] + (sum[i] - sum[j] + )*c[i];
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
sum[] = dp[] = ;
for (int i = ; i <= n; i++) scanf("%lld%lld", &sum[i], &c[i]), sum[i] += sum[i - ];
int head = , tail = ;
que[tail++] = ;
for(int i=;i<=n;i++)
{
while (head + < tail&&up(que[head + ], que[head]) <= c[i] * down(que[head + ], que[head])) head++;//如果满足这个式子
//就是说明que[head+1]比 que[head]更优,所以可以删去这个que[head] 然后之后不满足这个式子了,说明que[head]比que[head+1]更优
//说明这个时候的队首就是最优的,就可以跳出循环
dp[i] = DP(i, que[head]);
while (head + < tail&&up(i, que[tail - ])*down(que[tail - ], que[tail - ]) <= up(que[tail - ], que[tail - ])*down(i, que[tail - ])) tail--;
que[tail++] = i;
}
printf("%lld\n", dp[n]);
}
return ;
}
D - Pearls HDU - 1300 斜率dp+二分的更多相关文章
- B - Lawrence HDU - 2829 斜率dp dp转移方程不好写
B - Lawrence HDU - 2829 这个题目我觉得很难,难在这个dp方程不会写. 看了网上的题解,看了很久才理解这个dp转移方程 dp[i][j] 表示前面1~j 位并且以 j 结尾分成了 ...
- hdu2993之斜率dp+二分查找
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 3507 斜率dp
不好理解,先多做几个再看 此题是很基础的斜率DP的入门题. 题意很清楚,就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 设dp[i]表示输出前i个 ...
- hdu 2829 斜率DP
思路:dp[i][x]=dp[j][x-1]+val[i]-val[j]-sum[j]*sum[i]+sum[j]*sum[j]; 其中val[i]表示1~~i是一段的权值. 然后就是普通斜率dp做法 ...
- hdu 3586 树形dp+二分
题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim ...
- HDU 3480 斜率dp
Division Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 999999/400000 K (Java/Others)Total ...
- HDU - 1300 简单DP
题意:买珠子的方案有两种,要么单独买,价钱为该种类数量+10乘上相应价格,要么多个种类的数量相加再+10乘上相应最高贵的价格买 坑点:排序会WA,喵喵喵? 为什么连续取就是dp的可行方案?我猜的.. ...
- hdu 2993 斜率dp
思路:直接通过斜率优化进行求解. #include<iostream> #include<cstdio> #include<algorithm> #include& ...
- hdu 4258 斜率DP
思路:dp[i]=dp[j]+(num[i]-num[j+1])^2; #include<iostream> #include<cstring> #include<alg ...
随机推荐
- Pandownload作者被抓之后
近日,pandownload作者被抓,可以说是圈内的大事件,被抓之后, Pandownload 已经是打不开,用不了了 就在我为此感到惋惜的时候,竟然有出来个shengdownload 先来一块看看这 ...
- Jmeter发送jdbc请求进行大批量造数
创建批量造数脚本,一个简单的结构如下图所示, 1.线程组(10个线程重复运行2次,相当于造20个数) 2.用户定义变量(这是全局变量,用于后面随机筛选用) 3.数据库连接配置 4.计数器(用于主键递增 ...
- 博云DevOps 3.0重大升级 | 可用性大幅提升、自研需求管理&自定义工作流上线,满足客户多样化需求
DevOps能够为企业带来更高的部署频率.更短的交付周期与更快的客户响应速度.标准化.规范化的管理流程,可视化和数字化的研发进度管理和可追溯的版本也为企业带来的了更多的价值.引入DevOps成为企业实 ...
- 在Windows中使用VirtualBox安装Ubuntu
VeitualBox官网下载:https://www.virtualbox.org/wiki/Downloads 安装教程:http://dblab.xmu.edu.cn/blog/337-2/ 安装 ...
- Docker数据管理(一)
数据卷挂载 在生产环境中,需要对数据进行持久化,冗余化,或者在需要在多个容器之间进行数据共享 数据卷:容器内数据直接映射到本地主机环境 数据卷容器:使同特定容器维护数据卷 -v 进行映射 1.在容器内 ...
- [Inno Setup] 卸载 重启之后 删除文件
某些系统文件,例如驱动,不重启无法删除. 利用windows注册表里的 RunOnce.注意必须在HKLM下,否则可能权限不够. 不能直接填cmd命令,要以cmd的参数形式填写. procedure ...
- Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...
- Linux / mac OS Shell常用命令
一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...
- 虚拟化VMware之虚拟机备份(1)
之虚拟机备份() 模版:是一种开放,公用.安全的虚拟机压缩格式,通常使用的是扩展名为.ova可以在多个主流虚拟化平台下进行操作 是和 通过技术协作推出的基于磁盘的备份和恢复的新一代解决方案,可靠且易部 ...
- SAAS 何以“免费”实现盈利
本文讲的是SAAS 何以"免费"实现盈利,[IT168 资讯]"天下没有免费的午餐",然而众多厂商却恰恰打出了免费这张王牌,且做出了不小的成绩,淘宝就凭借免费淘 ...