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

输入格式
• 第一行:三个整数 KE N, 1 K 10000 , 1 E 500 , 1 N 500
• 第二行到第 N + 1 行:第 i + 1 行有三个整数 XiFi Ci, 0 < Xi < E, 1 Fi 10000, 1
Ci 107

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

样例输入
2 5 3
3 1 2
4 1 2
1 1 1

样例输出
9

解释
在离家较近的两家商店里各购买一吨饲料,
则花在路上的钱是 1 + 4 = 5,花在店里的钱是
2 + 2 = 4

【分析】

  嗯,啊,还是好笨,想了挺久。

  先列DP,f[i][x]=min(f[j][k]+(x-k)^2*(d[i]-d[j])+(x-k)*c[i]) d[i][x]表示走到i,一共买了x个东西的最小费用。

  但是这样列的话很难降维,因为答案跟d[j]有关,所以可以用 计算未来费用的思想,就是买的时候直接算他运到终点了。

  f[i][x]=min(f[j][k]+(x-k)*c[i]+(x^2-k^2)*(s-d[i])) 这样就可以降维了。

  f[x]=min(f[k]+(x-k)*c[i]+(x^2-k^2)*(s-d[i])) i直接for,不过要注意一点是要用的是i之前算出的f而不能是i时计算出的f

  如果没有限制的话,这样的方程当然存一个最优解就好了,但是有限制,就要看限制的单调性,我们要x-k<=sm[i] 即 k>=x-sm[i]

  x按顺序枚举的话就有单调性了。

  啊,又是一道限制为主的单调队列ORZ、、、

  

代码如下:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. using namespace std;
  9. #define Maxn 510
  10. #define Maxm 200010
  11. #define LL long long
  12.  
  13. struct node
  14. {
  15. LL d,sm,w;
  16. }t[Maxn];
  17.  
  18. LL mymin(LL x,LL y) {return x<y?x:y;}
  19. LL mymax(LL x,LL y) {return x>y?x:y;}
  20.  
  21. bool cmp(node x,node y) {return x.d<y.d;}
  22.  
  23. LL q[Maxm],st[Maxm],f[Maxm];
  24.  
  25. int main()
  26. {
  27. LL v,s,n;
  28. scanf("%lld%lld%lld",&v,&s,&n);
  29. for(LL i=;i<=n;i++) scanf("%lld%lld%lld",&t[i].d,&t[i].sm,&t[i].w);
  30. sort(t+,t++n,cmp);
  31. for(LL i=;i<=n;i++) t[i].d=s-t[i].d;
  32. memset(f,,sizeof(f));
  33. f[]=;
  34. int ql,qr;
  35. for(LL i=;i<=n;i++)
  36. {
  37. ql=qr=;q[qr]=;st[qr]=;
  38. for(LL j=;j<=v;j++)
  39. {
  40. while(ql<qr&&(j-st[ql])>t[i].sm) ql++;
  41. LL now=f[j];
  42. f[j]=mymin(f[j],q[ql]+t[i].d*j*j+t[i].w*j);
  43. while(now-j*j*t[i].d-t[i].w*j<=q[qr]&&qr>=ql) qr--;
  44. q[++qr]=now-j*j*t[i].d-t[i].w*j;st[qr]=j;
  45. }
  46. }
  47. printf("%lld\n",f[v]);
  48. return ;
  49. }

2016-10-20 09:14:21

Buying Feed, 2010 Nov (单调队列优化DP)的更多相关文章

  1. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  2. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  3. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  4. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  5. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  6. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  7. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  8. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  9. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. 20160408javaweb之JDBC 大二进制和大文件存取

    一.大文本存取: 我们有一本约10M的小说,现存入数据库: 代码如下:以junit测试的方式给出 package com.dzq.lob; import java.io.File; import ja ...

  2. nyoj832 合并游戏(状态压缩DP)

    题意 : n个石子, 给你一个n*n矩阵, A[i][j]表示第i个和第j个合并蹦出的金币值, 合并完石子 j 消失.求合并所有石子后,所得的最大金币数. 分析 :     1. 题中给的数据范围   ...

  3. 解决IE浏览器IFrame对象内存不释放问题

    最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...

  4. 加载jar文件输出class和method

    package file import java.util.jar.JarEntry import java.util.jar.JarFile import org.junit.Test; class ...

  5. Github进行项目管理的常用命令总结

    最近项目中使用github来管理代码,将git的常用命令整理了一下,方便以后查询 查看git的本地配置git config --list 克隆到本地git clone (网页上面的那个http地址 g ...

  6. ubuntu svn安装测试

    本机环境 :ubuntu 12.4 LTS desktop 1 sudo apt-get install  subversion  #安装svn 2  sudo mkdir   /home/lzj/s ...

  7. ubuntu14.04+opencv 3.0+python2.7安装及测试

    本文记录了ubuntu下使用源码手动安装opencv的过程.步骤来自opencv官网 此外记录了在python中安装及载入opencv的方法. 1.安装opencv所需的库(编译器.必须库.可选库) ...

  8. yaffs2文件系统

    1 .yaffs2源码目录文件复制到需要移植的linux内核目录fs/下 同时替换掉源码文件中的Makefile文件跟Kconfig文件. 2.在内核中添加对yaffs2的支持. 3.在make me ...

  9. 利用OllyDebug查看程序调用的dll模块

    最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰.具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在 ...

  10. PL/SQL学习(六)触发器

    原文参考:http://plsql-tutorial.com/ 创建语法: CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER | IN ...