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. Python 操作mysql数据库之 SQLAlchemy 案例详解

      前言: 字段声明类型中,最右边的是数据库中对应的字段,我们依然可以使用,其左边的的 SQLAchemy 则是其自身封装的自定义类型. 本篇不会讲太多的理论知识,因为这个实用性更强,所以通篇全部都是 ...

  2. Win8.1/Win10在某些程序输入中文变成问号的解决方法

    之前我是使用Win8.1,在某些软件上输入中文,却显示问号,换输入法也没用,当时也没用太在意,后来升级到Win10还是一样.同样的软件在其它Win8.1/Win10电脑却可以正常显示中文. 解决方法如 ...

  3. AJ学IOS(20)UI之UIPickerView_点菜系统

    AJ分享,必须精品 先看效果图 ## UIPickerView控件 UIPickerView用处: 用来展示很多行(row) 很多列(component )的数据,多用于电子商务的点菜,城市选择等等. ...

  4. Docker-Bridge Network 02 容器与外部通信

    本小节介绍bridge network模式下,容器与外部的通信. 1.前言2.容器访问外部2.1 访问外网2.2 原理2.3 一张图总结2.4 抓包3.外部访问容器3.1 创建nginx容器并从外部访 ...

  5. BUU刷题01

    [安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...

  6. CISCN love_math和roarctf的easy_clac学习分析

    Love_math 题目源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ show ...

  7. layui table渲染和数据处理

    最近在用layui开发管理系统,果然是"累"ui 实现功能:将之前选择的选项勾选,渲染备注信息(原数据为空的列) <table class="layui-hide& ...

  8. wordpress 常用操作

    删除主题 在主题目录 wp-content/themes 中直接删除即可. 首页和文章页使用不同主题 首页使用sidebar,文章页不使用sidebar,这样文章的内容可以占更宽的页面 安装插件 Mu ...

  9. jQuery(*****)

    参考1 参考2 1. jQuery 1. 选择器 $("") 1. 基本选择器 1. ID --> $("#d1") 2. 标签名 --> $(&q ...

  10. win10好用的桌面工具分享+网盘下载链接

    1.Everything Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name in ...