额,直接思路就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. Bugku练习

    首先我们拿到了一个admin.exe的文件,根据惯例我先用查一下有没有加壳: ???这是怎么回事??? 我于是用了winhex打开看了一下,发现 这不就是data协议吗~~~,把后面的base64解密 ...

  2. 2016 10月15日java的动手动脑

    (1) 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. 源程序: //随机数的产生 //zhanxinwu,October,15,2016 public class Recur ...

  3. Mac安装Command Line Tools

    从App Store上下载的Xcode,默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序. 在终端中输入命 ...

  4. IT爱心求助站

    最近发生的一些事情,让我对自己的专业有了另外一层认识. 小尹同学,你是做软件的是吗?能否帮我看一下我的电脑问题? 老同学,我的电脑安装一个软件这么都装不上,能否帮我看一下呢? 邻居你好,我的手机怎么没 ...

  5. 使用malloc函数或new运算符为链表结点分配内存空间

    目录 使用malloc函数或new运算符为链表结点分配内存空间 使用malloc函数或new运算符为链表结点分配内存空间 当我们定义链表结点类型后,如何在每次需要使用新结点时临时分配相应大小的内存空间 ...

  6. 2019滴滴java面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  7. 从零起步 系统入门Python爬虫工程师 ✌✌

    从零起步 系统入门Python爬虫工程师 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 大数据时代,python爬虫工程师人才猛增,本课程专为爬虫工程师打造, ...

  8. 介绍ArcGIS中各种数据的打开方法——shp(矢量文件)

    2.加载shp文件到地图控件 ShapeFile是一种矢量数据模型的计算机数据组织文件,用于在计算机上表达矢量数据的计算机文件. 加载ShapeFile文件最主要是:axMapControll控件对象 ...

  9. Hadoop实战1:MapR在ubuntu集群中的安装

    由于机器学习算法在处理大数据处理的时候在所难免的会效率降低,公司需要搭建hadoop集群,最后采用了商业版的Hadoop2(MapR). 官网: http://doc.mapr.com/display ...

  10. 《锋利的jQuery》学习总结

    通过对<锋利的jQuery>(第二版)一书的学习,发现此书讲解通俗易懂,是学习jQuery的一本很好的指导书,特作如下总结.此书主要讲解了jQuery的常用操作,包括认识jQuery,jQ ...