题面

约翰开车来到镇上,他要带V吨饲料回家。如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元。约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第i家店的位置是Xi,饲料的售价为每吨Ci元,库存为Fi。n≤500,k≤10000。

输入格式

第1行:三个整数 V,E,N

第2..N+12..N+1行:第i+1行的三个整数代表Xi​,Fi​,Ci​ .

输出格式

一个整数,代表最小花费.

数据范围

1 ≤ V≤ 10000 , 1 ≤ E ≤ 500 , 1 ≤ N ≤ 500;

0 < Xi < E, 1 ≤ Fi ≤ 10000, 1 ≤ Ci ≤ 10^7

思路

首先打一个2维dp,表示在第i个点拥有j个饲料需要至少多少钱。

sort一遍xi,然后三重循环dp,方程为dp[i][j]=min(dp[i][j],dp[i-1][j-k]+a[i].c*k+(a[i].x-a[i-1].x)*(j-k)*(j-k));

最后cout<<dp[n][v]+(e-a[n].x)*v*v<<endl;表示最后一个店到家的最少价格+1...n家店的最小价值(就是1...n的最小价值)

#include<bits/stdc++.h>
using namespace std;
struct node{int x,f,c;}a[505];
long long v,e,n,dp[505][10005];
bool cmp(node p,node q){return p.x<q.x;}
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
    while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
int main(){
    freopen("d.in","r",stdin);
    freopen("d.out","w",stdout);
    v=read();e=read();n=read();
    memset(dp,0x7f,sizeof(dp));
    for (int i=1;i<=n;i++) a[i].x=read(),a[i].f=read(),a[i].c=read();
    sort(a+1,a+n+1,cmp);
    dp[0][0]=0;
    for (int i=1;i<=n;i++)
     for (int j=0;j<=v;j++)
      for (int k=0;k<=a[i].f&&k<=j;k++)
      dp[i][j]=min(dp[i][j],dp[i-1][j-k]+a[i].c*k+(a[i].x-a[i-1].x)*(j-k)*(j-k));
     cout<<dp[n][v]+(e-a[n].x)*v*v<<endl;
    return 0;
}

可惜以上方法会炸

那就让我们来优化吧:首先把家当做一个店,距离为e,库存为0,单价为0.

然后用一个deque存k.

如果(j-q.front() > a[i-1].f)就pop掉队首, 因为i-1的店库存不够;

如果top=q.back(), dp[i-1][top]-a[i-1].c*top>=dp[i-1][j]-w[i-1]*j, 就pop掉队尾;

过程中有可能爆int,所以开long long。

 #include<bits/stdc++.h>
 using namespace std;
 ];
 ][];
 bool cmp(node p,node q){return p.x<q.x;}
 int main(){
     freopen("d.in","r",stdin);
     freopen("d.out","w",stdout);
     cin>>v>>e>>n;
     memset(dp,0x7f,sizeof(dp));
     ;i<=n;i++) cin>>a[i].x>>a[i].f>>a[i].c;
     n++;
     a[n]=(node){e,,};
     sort(a+,a+n+,cmp);
     dp[][]=;
     ;i<=n;i++)
     {
         deque<long long>q;
         ;j<=v;j++)
         {
             ].f) q.pop_front();
             ][j]!=0x7f)
             {
                 ][q.back()]-a[i-].c*q.back()>=dp[i-][j]-a[i-].c*j) q.pop_back();
                 q.push_back(j);
             }
             int top=q.front();
             ][top]-a[i-].c*top+(a[i].x-a[i-].x)*j*j+a[i-].c*j;
         }
     }
      cout<<dp[n][v]<<endl;
     ;
 }    

【BZOJ2059】Buying Feed 购买饲料的更多相关文章

  1. BZOJ2059: [Usaco2010 Nov]Buying Feed 购买饲料

    数轴上n<=500个站可以买东西,每个站位置Xi,库存Fi,价格Ci,运东西价格是当前运载重量的平方乘距离,求买K<=10000个东西到达点E的最小代价. f[i,j]--到第i站不买第i ...

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

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

  3. 【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 ...

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

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

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

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

  6. USACO Buying Feed, II

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

  7. BUYING FEED

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

  8. ACM BUYING FEED

    BUYING FEED 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 Farmer John needs to travel to town to pick up ...

  9. [BZOJ1618][Usaco2008 Nov]Buying Hay 购买干草

    [BZOJ1618][Usaco2008 Nov]Buying Hay 购买干草 试题描述 约翰的干草库存已经告罄,他打算为奶牛们采购H(1≤H≤50000)磅干草. 他知道N(1≤N≤100)个干草 ...

随机推荐

  1. requestMapping设置客户端访问地址

  2. Swap HDU - 2819 (有关矩阵的二分匹配)

    题意见大佬:https://www.cnblogs.com/gj-Acit/archive/2013/08/17/3265502.html 题目大意很明确,交换图的某些行或者是某些列(可以都换),使得 ...

  3. hihoCoder 1631 Cats and Fish(ACM-ICPC北京赛区2017网络同步赛)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU campus. They are all happy ...

  4. 【bzoj3091】 城市旅行

    http://www.lydsy.com/JudgeOnline/problem.php?id=3091 (题目链接) 题意 给出一棵无根树,维护四个操作.link,cut,路径加法,路径期望查询. ...

  5. IntelliJ IDEA 创建Java Web项目

    1. 创建Web项目 可以先阅读 IntelliJ IDEA 的安装和使用教程 注意:IntelliJ IDEA 中 Project 和 Module 的概念及区别 创建完成后点击Import Cha ...

  6. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  7. 关于 Java 中的 Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  8. Logistic回归中损失函数求导证明过程

  9. C++ ------ const迭代器 和 const_iterator的区别

    const迭代器,顾名思义,就是不能改变的迭代器,是常量,其性质是由const决定的.比如说我们这样定义一个const迭代器. vector<,); const vector<int> ...

  10. 转:Xcode打印堆栈信息

    2#   分享于 14-11-26 19:15:36 Chrome 39.0.2171.71 Mac OS X 10.10.1 如果只是看调用栈的话,可以使用 lldb 的功能.在你的代码里面打上一个 ...