http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1963

题意:
有m个坑,每只兔子会在ti时刻回到坑中,现在有n个人,每个人都可以从任意时间(<0也可以)从第一个坑出发,速度为1,如果路过的坑中有兔子,就给它喂食物,每只兔子喂一次即可,计算所有兔子等待时间的最短之和。

思路:
对于第i只兔子,如果有个人在y时间正好经过喂了它,那么那个人出发的时间为y-x。现在现计算出每只兔子的y-x值,记为t【】,并排好序。sum【】表示前i只兔子的y-x值。

接下来就是动态转移了,d【i】【j】表示第i个人正好经过第j只兔子时的最小等待时间。

那么状态转移方程就是

d[i][j]=min(d[i][j],d[i-][k]+(j-k)*t[j]-(sum[j]-sum[k]))

解释一下这个方程的意思:d【i-1】【k】表示上一个人正好经过第k只兔子时的最小等待时间,那么j~k之间的兔子肯定是要轮到第i个人来喂了,因为第i个人的出发时间更晚一些,所以j~k这些兔子肯定是要等待的,等待的时间就是,也就是上式的(j-k)*t[j]-(sum[j]-sum[k])。

理解了这个之后,接下来就是斜率优化dp的应用了,这样的状态转移方程也容易让人想到斜率优化dp。

设z<k<j,如果k的决策比z的决策更好,那么在上述的状态转移方程中满足

d[i-][k]+(j-k)*t[j]-(sum[j]-sum[k]) < d[i-][z]+(j-z)*t[j]-(sum[j]-sum[z])

整理得到,那这就是明显的斜率优化dp了。

所谓的斜率优化dp,就是每新插入一个点的时候,需要维护一条下凸的形状,对于会形成上凸的点,我们可以直接删去,因为它肯定不会是最优解。

那么如何维护呢?使用单调队列。

每次依次先检查队首的两个元素,如果满足上式,那么说明队首的第二个值更优,可以删除第一个值,直到第一个值比第二个元素更优。

然后是队尾的检查,如果新插入的点使得队尾的点成为了上凸点,那么就需要删去这个上凸点,直到没有上凸点产生。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+ ; int n, m, p;
ll t[maxn];
ll Q[maxn];
ll sum[maxn];
ll dis[maxn];
ll d[][maxn]; ll dy(int i, int j, int k)
{
return (d[i-][j]+sum[j])-(d[i-][k]+sum[k]);
} ll dx(int j, int k)
{
return j-k;
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n, &m, &p))
{
dis[]=;
for(int i=;i<=n;i++)
{
scanf("%I64d",&dis[i]);
dis[i]+=dis[i-];
} for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
t[i]=y-dis[x];
} sort(t+,t+m+);
sum[]=;
for(int i=;i<=m;i++)
sum[i]=sum[i-]+t[i]; for(int i=;i<m;i++)
d[][i]=t[i]*i-sum[i]; for(int i=;i<=p;i++)
{
int frt=, rear=-;
for(int j=;j<=m;j++)
{
while(frt<rear && dy(i,Q[frt+],Q[frt])<t[j]*dx(Q[frt+],Q[frt])) frt++;
while(frt<rear && (dy(i,Q[rear],Q[rear-])*dx(j,Q[rear]))>=(dy(i,j,Q[rear])*dx(Q[rear],Q[rear-])))
rear--;
Q[++rear]=j; int tmp=Q[frt];
d[i][j]=d[i-][tmp]-(tmp-j)*t[j]-(sum[j]-sum[tmp]);
}
}
cout<<d[p][m]<<endl;
}
return ;
}

CSU 1963 Feed the rabbit(斜率优化dp)的更多相关文章

  1. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  2. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  3. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  4. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  5. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  6. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  7. HDU2829 Lawrence(斜率优化dp)

    学了模板题之后上网搜下斜率优化dp的题目,然后就看到这道题,知道是斜率dp之后有思路就可以自己做不出来,要是不事先知道的话那就说不定了. 题意:给你n个数,一开始n个数相邻的数之间是被东西连着的,对于 ...

  8. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  9. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

随机推荐

  1. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  2. 【Android】android string.xml前后加空格的技巧

    android string.xml 文字中间加入空格 <string name="password">密    码</string> &#160 ...

  3. Swift - 把汉字转换为拼音,并且截取首字母做索引用

    var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas") CFStri ...

  4. postgresql----TEMPORARY TABLE和UNLOGGED TABLE

    一.TEMPORARY|TEMP TABLE 会话级或事务级的临时表,临时表在会话结束或事物结束自动删除,任何在临时表上创建的索引也会被自动删除.除非用模式修饰的名字引用,否则现有的同名永久表在临时表 ...

  5. pta 天梯地图 (Dijkstra)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  6. UESTC 485 Game(康托展开,bfs打表)

    Game Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status t ...

  7. Process Monitor分析某个应用行为

    1.打开Process Mointor 2.点击filter-->filter   在弹出的对话框中Architecture 下拉框,选择Process Name 填写要分析的应用程序名字. 点 ...

  8. Webservice实践(七)CXF 与Spring结合+tomcat发布

    上一节介绍了如何使用CXF 来发布服务,但是没有介绍使用web 容器来发布,很多项目需要用tomcat 这样的容器来发布.另外本节将介绍CXF 与spring 结合的方法. 一 目标: 1.利用spi ...

  9. Asp.NET 与 WebApi 共享Session

    首先新建一个.net framework 4.5.2的 web应用程序,选择WebApi基架,包括MVC与Webapi 1.在global.asax中启用Session 2.在HomeControll ...

  10. Linux squid 缓存服务器

    一.简介 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用 ...