额,直接思路就dp吧。(我还想了想最短路之类的233但事实证明不行2333.....)

直入主题:

化简题意:在x轴上有n个点,坐标为xi。从原点出发,目标点为e,在途中需要收集K重量的物品,在每个点有收集的上限和单价,路费是当前已收集重量*距离,求最小值。

首先,最暴力的方程式很好推(普及难度),枚举当前点,当前点总重量,nk^2的复杂度(25 0000 0000 233.....)于是直接gg。

所以,方程式:

dp[i][j]=min(dp[i-][p]+dis[i] j^+w[i-] (j-p));

枚举一个p, 表示第i-1个商店时有p个货物,那么显然在i-1个商店买了(j-p)个货物,算上在第i-1个商店的花费,加上从i-1到i的路费,就是dp[i][j];

没错,很暴力(stay sample,stay naive)据zwjdd说裸的能过70分岂不是很赚???

于是考虑优化.

1、方程式无法改写,状态无法改变(可能是我太蔡了)

2、不是斜率优化的形式

3、没法贪心(废话)

所以考虑单调队列优化。那我就要找一个无关变量然后把它咕掉喽

睁大我的小眼,盯着方程式看:有个括号?不爽,展开展开

dp[i-][p] - w[i-]p + dis[i]*j*j + w[i-]*j;

所以呢,变量有i(i-1),j,p。

而i和j都不变,所以对于当前状态来说,影响它的只有p了(装多少)

开心,把p压到单调队列里变成log应该就能过去了。

所以开心地来单调队列吧

考虑两种情况:1、题目限制(装的上限)

2、最优解(装多少)

所以,针对第一种情况,如果装完的总量-当前装的量>当前点上限,直接pop掉队头。

针对第二种情况,也是本题的优化核心。

在这里提一下单调队列优化的核心,首先要知道单调队列是什么:单调队列是一个内部元素单调增/减的队列(废话)

那这个性质有什么用呢?它可以大大优化最值的寻找复杂度。优化的方程往往长这样:

f [ x ] = m a x ( f [ j ] ) + mx
其中mx是要找的最大值,这也就是网上题解讲的:
与j的取值无关

而mx的枚举往往需要一个n的复杂度,所以均摊复杂度就变成了n方。

单调队列就是一个可以把这个n缩到O(1)的神奇数据结构。(完全不了解的去看滑动窗口)

在枚举一行(此题的j)中找到一个状态j,确定它是最小值,

所以,我们针对每一种情况弄出一个p,扔到单调队列里。

这里,要结合方程式了。队列里的元素单调,我们枚举这些元素,然后代入原方程,比较最值,更新队列顶,维护最值,下面进行更新状态。

于是:

if(f[i-][j]!=0x3f3f3f3f)
{
while(!q.empty()&&f[i-][q.back()]-a[i-].c*q.back()>=f[i-][j]-a[i-].c*j)
q.pop_back();
q.push_back(j);
}

 优化就诞生了,下面只要用队列顶维护状态就可以了。

#include<bits/stdc++.h>
using namespace std;
const long long maxn=;
int K,E,n;
struct node
{
long long x,f,c;
}a[maxn];
bool cmp(node a,node b)
{
return a.x<b.x;
}
long long f[maxn][maxn*];
long long dis[maxn];
int main()
{
scanf("%lld%lld%lld",&K,&E,&n);
for(int i=;i<=n;i++)
{
scanf("%lld%lld%lld",&a[i].x,&a[i].f,&a[i].c);
}
a[++n]=(node){E,,};
sort(a+,a+n+,cmp);
memset(f,0x3f,sizeof(f));
/*for(long long i=1;i<=k;i++)
{
f[1][i]=a[1]*k;
}*/
f[][]=;
for(int i=;i<=n;i++)
{
deque < long long > q;
for(int j=;j<=K;j++)
{
while(!q.empty() && j-q.front()>a[i-].f)
q.pop_front();
if(f[i-][j]!=0x3f3f3f3f)
{
while(!q.empty()&&f[i-][q.back()]-a[i-].c*q.back()>=f[i-][j]-a[i-].c*j)
q.pop_back();
q.push_back(j);
}
long long k=q.front();
if(!q.empty())
f[i][j]=f[i-][k]-a[i-].c*k+(a[i].x-a[i-].x)*j*j+a[i-].c*j;
}
}
printf("%lld",f[n][K]);
return ;
}

(完)

P4544 [USACO10NOV]购买饲料Buying Feed的更多相关文章

  1. [USACO10NOV]购买饲料Buying Feed 单调队列优化DP

    题目描述 约翰开车来到镇上,他要带 KKK 吨饲料回家.运送饲料是需要花钱的,如果他的车上有 XXX 吨饲料,每公里就要花费 X2X^2X2 元,开车D公里就需要 D×X2D\times X^2D×X ...

  2. 【luoguP4544】[USACO10NOV]购买饲料Buying Feed

    题目链接 首先把商店按坐标排序 \(dp_{i,j}\)表示前i个商店买了j吨饲料并运到终点的花费,二进制拆分优化转移 #include<algorithm> #include<io ...

  3. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...

  4. 【P2616】 【USACO10JAN】购买饲料II Buying Feed, II

    P2616 [USACO10JAN]购买饲料II Buying Feed, II 题目描述 Farmer John needs to travel to town to pick up K (1 &l ...

  5. 【BZOJ2059】Buying Feed 购买饲料

    题面 约翰开车来到镇上,他要带V吨饲料回家.如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元.约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第i家店的位置是Xi, ...

  6. 2020: [Usaco2010 Jan]Buying Feed, II

    2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 220  Solved: 162[ ...

  7. USACO Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II 洛谷传送门 JDOJ 2671: USACO 2010 Jan Silver 2.Buying Feed, II ...

  8. 洛谷P2729 饲料调配 Feed Ratios

    P2729 饲料调配 Feed Ratios 36通过 103提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 农夫约翰从来只用调 ...

  9. BUYING FEED

    Problem F: F BUYING FEED Description Farmer John needs to travel to town to pick up K (1 <= K < ...

随机推荐

  1. 六、springboot 简单优雅是实现短信服务

    前言 上一篇讲了 springboot 集成邮件服务,接下来让我们一起学习下springboot项目中怎么使用短信服务吧. 项目中的短信服务基本上上都会用到,简单的注册验证码,消息通知等等都会用到.所 ...

  2. 【JZOJ5263】分手是祝愿

    Description 请注意本题的数据范围. Input Output Sample Input 2 2 15 19 3 30 40 20 Sample Output 285 2600 Hint 数 ...

  3. Vijos 1067守望者的烦恼

    背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她传送到后面的监狱内查看,她比较懒,一般不查看 ...

  4. Json模块(dumps、loads、dump、load)函数篇

    # dumps.loads函数 """json.dumps()用于将dict类型的数据转成strjson.loads()用于将str类型的数据转成dict. " ...

  5. 如何在Linux服务器上部署Mysql

    一.安装mysql 1.通过文件上传工具,将mysql安装包上传到linux服务器上 2.卸载mariadb包,由于系统中存在mariadb包会导致mysql安装时报错mariadb-libs被mys ...

  6. Zeppelin的安装和SparkSQL使用总结

    zeppelin是spark的web版本notebook编辑器,相当于ipython的notebook编辑器. 一Zeppelin安装 (前提是spark已经安装好) 1 下载https://zepp ...

  7. [NOIp2014] luogu P2296 寻找道路

    不知道是因为我菜还是别的,最近老是看错题. 题目描述 在有向图 GGG 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向 ...

  8. MVC路径无匹配或请求api版本过低时处理

    解决方案:RequestMappingHandlerMapping中重写handleNoMatch方法,springMVC和springboot中配置无区别. 另: 1.可搭配advice处理抛出的异 ...

  9. opencv::霍夫圆变换

    霍夫圆检测原理 从平面坐标到极坐标转换三个参数 假设平面坐标的任意一个圆上的点,转换到极坐标中: 处有最大值,霍夫变换正是利用这个原理实现圆的检测. cv::HoughCircles 因为霍夫圆检测对 ...

  10. Vue躬行记(4)——组件

    组件是可复用的Vue实例,拥有属于自己的数据.模板.脚本和样式,可避免繁重的重复性开发.由于组件都是独立的,因此其内部代码不会影响其它组件,但可以包含其它组件,并且相互之间还能通信. 一.注册 在使用 ...