D - Pearls

HDU - 1300

这个题目也是一个比较裸的斜率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+二分的更多相关文章

  1. B - Lawrence HDU - 2829 斜率dp dp转移方程不好写

    B - Lawrence HDU - 2829 这个题目我觉得很难,难在这个dp方程不会写. 看了网上的题解,看了很久才理解这个dp转移方程 dp[i][j] 表示前面1~j 位并且以 j 结尾分成了 ...

  2. hdu2993之斜率dp+二分查找

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. hdu 3507 斜率dp

    不好理解,先多做几个再看 此题是很基础的斜率DP的入门题. 题意很清楚,就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 设dp[i]表示输出前i个 ...

  4. 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做法 ...

  5. hdu 3586 树形dp+二分

    题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim ...

  6. HDU 3480 斜率dp

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others)Total ...

  7. HDU - 1300 简单DP

    题意:买珠子的方案有两种,要么单独买,价钱为该种类数量+10乘上相应价格,要么多个种类的数量相加再+10乘上相应最高贵的价格买 坑点:排序会WA,喵喵喵? 为什么连续取就是dp的可行方案?我猜的.. ...

  8. hdu 2993 斜率dp

    思路:直接通过斜率优化进行求解. #include<iostream> #include<cstdio> #include<algorithm> #include& ...

  9. hdu 4258 斜率DP

    思路:dp[i]=dp[j]+(num[i]-num[j+1])^2; #include<iostream> #include<cstring> #include<alg ...

随机推荐

  1. Des对称可逆加密

    /// <summary> /// DES AES Blowfish ///  对称加密算法的优点是速度快, ///  缺点是密钥管理不方便,要求共享密钥. /// 可逆对称加密  密钥长 ...

  2. iOS GIF图片转UIImage

    多平台保持统一风格的UI设计,少不了一些动态图片的使用 1.本地GIF图片使用 1.1 将本地GIF转为NSdata类型 NSData *tempdata = [NSData dataWithCont ...

  3. tp5中“前置操作”和“钩子函数”的区别

    1.实行顺序: 以下都是标为删除前的操作: 点击删除  ->  前置操作  ->  删除方法(用模型删除)  ->  触发钩子函数(删除)  ->  删除成功 2.传入的参数: ...

  4. Python 删除含有只读文件(夹)的文件夹

    def rm_read_only(fn, tmp, info): if os.path.isfile(tmp): os.chmod(tmp, stat.S_IWRITE) os.remove(tmp) ...

  5. opencv-5-图像遍历与图像改变

    opencv-5-图像遍历与图像改变 opencvc++qt 目录 目录 开始 图像的像素点访问与遍历 opencv 座标定义 下标访问 指针访问 迭代器法访问 遍历访问时间对比 图像操作 图像叠加 ...

  6. Libra白皮书解读

    文章目录 Libra简介 Libra区块链 Libra货币和存储 Libra协会 Libra简介 Libra是facebook发起的一个区块链项目,其使命是建立一套简单的.无国界的货币和为数十亿人服务 ...

  7. CentOS7虚拟机安装vmtools

    直接开始: 在安装vmtools之前,需要先安装两个小部件,否则将安装失败. 下面是步骤: 1.切换为root模式,需要输入root密码,但是不显示. 命令为: su 2.安装gcc 命令为: yum ...

  8. RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别

    RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别 先贴一段代码 public void logon(Http ...

  9. SaltStack的数据系统

    一.SaltStack数据系统的分类 1.Grains(收集的是静态数据) 官方使用文档:https://www.unixhot.com/docs/saltstack/topics/targeting ...

  10. (转)logback配置详解

    找到一篇很详细的关于logback配置的介绍: 贴上原文链接:logback使用配置详解 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为下面下个模块: logback ...