题目描述

约翰开车回家,又准备顺路买点饲料了(咦?为啥要说“又”字?)回家的路程一共有 E 公里,
这一路上会经过 N 家商店,第 i 家店里有 F i 吨饲料,售价为每吨 C i 元。约翰打算买 K 吨饲料,他
知道商家的库存是足够的,至少所有店的库存总和不会少于 K。除了购买饲料要钱,运送饲料也是
要花油钱的,约翰的卡车上如果装着 X 吨饲料,那么他行驶一公里会花掉 X2 元,行驶 D 公里需要
DX2 元。已知第 i 家店距约翰所在的起点有 X i 公里,那么约翰在哪些商店买饲料运回家,才能做到
最省钱呢?

输入

• 第一行:三个整数 K,E 和 N,1 ≤ K ≤ 10000,1 ≤ E ≤ 500,1 ≤ N ≤ 500
• 第二行到第 N + 1 行:第 i + 1 行有三个整数 X i ,F i 和 C i ,0 < X i < E,1 ≤ F i ≤ 10000,1 ≤
C i ≤ 10 7

输出

• 单个整数:表示购买及运送饲料的最小费用

样例输入

2 5 3 3 1 2 4 1 2 1 1 1

样例输出

9

提示

在离家较近的两家商店里各购买一吨饲料,
则花在路上的钱是 1 + 4 = 5,花在店里的钱是
2 + 2 = 4
 
 
题解:
这题需要一种奇怪的思想:我们知道一顿饲料如果买了,必将一直影响到最后,于是我们将后来的消费就算到状态里去
于是可以定义f[i][j]表示前i个买j吨一直到终点的花费.然后发现可以消维.
保留f[j]即可  
定义d[i]为i到终点的距离.
f[j]=min(f[k]+j^2*d[i]-k^2*d[i]+j*F[i])
把k有关的全部都移项移出来,就可以放到单调队列里
 
单调队列动规:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
typedef long long ll;
struct node
{
ll x,w,v;
}a[N];
ll f[M],q[M],id[M];
bool comp(const node &p,const node &q){return p.x<q.x;}
int main()
{
int n,m,e;
scanf("%d%d%d",&m,&e,&n);
for(int i=;i<=n;i++)scanf("%lld%lld%lld",&a[i].x,&a[i].w,&a[i].v);
sort(a+,a+n+,comp);
for(int i=;i<=n;i++)a[i].x=e-a[i].x;
for(int i=;i<=m;i++)f[i]=2e16;
f[]=;
ll tmp;int l,r;
for(int i=;i<=n;i++)
{
l=r=;q[l]=;id[l]=;
for(int j=;j<=m;j++)
{
while(l<r && j-id[l]>a[i].w)l++;
tmp=f[j];
f[j]=min(f[j],q[l]+j*j*a[i].x+j*a[i].v);
while(l<=r && tmp-j*j*a[i].x-j*a[i].v<=q[r])r--;
q[++r]=tmp-j*j*a[i].x-j*a[i].v;id[r]=j;
}
}
printf("%lld\n",f[m]);
return ;
}

70分暴力动规:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=,M=;
const ll xy=2e15;
struct node
{
int w,v,x;
}a[N];
ll F[N][M];
bool comp(const node &p,const node &q){return p.x<q.x;}
int main()
{
freopen("pp.in","r",stdin);
int n,m,e;
scanf("%d%d%d",&m,&e,&n);
for(int i=;i<=n;i++)scanf("%d%d%d",&a[i].x,&a[i].w,&a[i].v);
a[++n].x=e;
sort(a+,a+n+,comp);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)F[i][j]=xy;
F[][]=;
ll now;int tmp;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
tmp=j-a[i].w>=?j-a[i].w:;
if(F[i-][tmp]==xy)break;
for(int k=tmp;k<=j;k++)
{
now=F[i-][k]+k*k*(a[i].x-a[i-].x)+a[i].v*(j-k);
if(now<F[i][j])F[i][j]=now;
}
}
}
printf("%lld\n",F[n][m]);
}

【USACO】又买饲料 单调队列dp的更多相关文章

  1. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...

  2. [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)

    传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...

  3. zstu 4237 马里奥的求救——(单调队列DP)

    题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. ...

  4. 1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP

    1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在 ...

  5. 卖饲料——单调队列优化dp

    题目描述 约翰开车来到镇上,他要带K吨饲料回家.运送饲料是需要花钱的,如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元.约翰可以从N家商店购买饲料,所有商店都在一个坐标轴 ...

  6. BZOJ1855 [Scoi2010]股票交易[单调队列dp]

    题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...

  7. 20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)

    http://codeforces.com/gym/100801/attachments 题意:给出n-1张不同的票,票价分别为 pi,每张票每次最多可以坐 r 个站(1<=r<n),并且 ...

  8. vijos P1243 生产产品(单调队列+DP)

      P1243生产产品   描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...

  9. POJ 1821 单调队列+dp

    题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...

随机推荐

  1. 20145237 实验一 逆向与Bof基础

    20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...

  2. 前端面试之angular JS

    1. angular的数据绑定采用什么机制?详述原理 angularjs的双向数据绑定,采用脏检查(dirty-checking)机制.ng只有在指定事件触发后,才进入 $digest cycle : ...

  3. $(function(){})和window.onload的区别

    (1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行

  4. jenkins 简单实现php集成上线部署

    基于公司git版本控制,搭建jenkins实现php集成部署(没有用gitlab,测试服配置较低,gitlab卡的不要不要的了-) 一.安装jenkins相关依赖 wget -O /etc/yum.r ...

  5. Ansible实战演练

    [root@Ansible-server ~]# rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.n ...

  6. C# word文档转换成PDF格式文档

    最近用到一个功能word转pdf,有个方法不错,挺方便的,直接调用即可,记录下 方法:ConvertWordToPdf(string sourcePath, string targetPath) so ...

  7. MFC基础

    入门博客:http://www.cnblogs.com/qinfengxiaoyue/category/451679.html 消息机制:http://www.cnblogs.com/qinfengx ...

  8. 【iOS】UIViewController基类的实现

    继承是面向对象编程语言的三大特性之一,写好基类会给App的开发带来极大的方便.在iOS开发中,一般一个页面就对应一个ViewController,ViewController在开发中用的也很多,写一个 ...

  9. Android WebView那些坑之上传文件

    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片. 解决问题之前我们先来说说WebView上传文件的逻辑:当我们在Web页面上点击 ...

  10. Windows10+Docker搭建分布式Redis集群(一)

    摘要,Docker for Windows 仅支持专业版 目录 第一步:检查系统支持虚拟化 第二步:下载Docker对应版本 第三步:配置镜像加速 第一步:检查系统是否支持虚拟化 Docker前提是需 ...