bzoj2059[Usaco2010 Nov]Buying Feed 购买饲料*
bzoj2059[Usaco2010 Nov]Buying Feed 购买饲料
题意:
约翰开车来到镇上,他要带K吨饲料回家。如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元。约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第i家店的位置是Xi,饲料的售价为每吨Ci元,库存为Fi。n≤500,k≤10000。
题解:
dp。f[i][j]表示在第i个地方,有j吨饲料:f[i][j]=f[i-1][k]+C[i-1]*(j-k)+j*(X[i]-x[i-1]),j-k≤F[i-1]。化简得f[i][j]=f[i-1][k]-C[i-1]*k+C[i-1]*j+j*(X[i]-x[i-1]),即对每个j找到最小的f[i-1][k]-C[i-1]*k,且满足j-k≤F[i-1],故可以用优先队列优化,使复杂度降低为O(nk)。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 10010 7 #define ll long long 8 #define INF 1e16 9 using namespace std; 10 11 inline int read(){ 12 char ch=getchar(); int f=1,x=0; 13 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 14 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 15 return f*x; 16 } 17 long long f[2][maxn]; int n,k,e,x,y,r; 18 struct nd{ll x,f,c;}nds[maxn]; bool cmp(nd a,nd b){return a.x<b.x;} 19 struct ddq{ 20 deque<pair<ll,int> >dq; 21 void insert(ll x,int y){ 22 while(!dq.empty()&&dq.back().first>=x)dq.pop_back(); dq.push_back(make_pair(x,y)); 23 } 24 void erase(int y){ 25 while(!dq.empty()&&dq.front().second<=y)dq.pop_front(); 26 } 27 }ddq; 28 int main(){ 29 k=read(); e=read(); n=read(); x=0; y=1; inc(i,1,n){nds[i].x=read(); nds[i].f=read(); nds[i].c=read();} 30 nds[++n]=(nd){e,0,0}; sort(nds+1,nds+n+1,cmp); inc(i,1,k)f[x][i]=INF; f[x][0]=0; 31 inc(i,2,n){ 32 ddq.dq.clear(); r=0; 33 inc(j,0,k){ 34 while(r<=j)ddq.insert(f[x][r]-r*nds[i-1].c,r),r++; ddq.erase(j-nds[i-1].f-1); 35 if(ddq.dq.empty())f[y][j]=INF; 36 else f[y][j]=ddq.dq.front().first+j*nds[i-1].c+j*j*(nds[i].x-nds[i-1].x); 37 } 38 swap(x,y); 39 } 40 printf("%lld",f[x][k]); return 0; 41 }
20161017
转载于:https://www.cnblogs.com/YuanZiming/p/5981993.html
bzoj2059[Usaco2010 Nov]Buying Feed 购买饲料*相关推荐
- BZOJ2059: [Usaco2010 Nov]Buying Feed 购买饲料
数轴上n<=500个站可以买东西,每个站位置Xi,库存Fi,价格Ci,运东西价格是当前运载重量的平方乘距离,求买K<=10000个东西到达点E的最小代价. f[i,j]--到第i站不买第i ...
- [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料
首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...
- bzoj2020[Usaco2010 Jan]Buying Feed, II*
bzoj2020[Usaco2010 Jan]Buying Feed, II 题意: FJ开车去买食物,如果他的车上有X份食物.每走一里就花费X元. 城市总共E里路,FJ从0开始走,到E结束(不能往回 ...
- bzoj 1618: [Usaco2008 Nov]Buying Hay 购买干草(完全背包)
1618: [Usaco2008 Nov]Buying Hay 购买干草 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1196 Solved: 62 ...
- 洛谷 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 ...
- Buying Feed, 2010 Nov (单调队列优化DP)
约翰开车回家,又准备顺路买点饲料了(咦?为啥要说"又"字?)回家的路程一共有 E 公里, 这一路上会经过 K 家商店,第 i 家店里有 Fi 吨饲料,售价为每吨 Ci 元.约翰打算 ...
- 洛谷 P4544 [USACO10NOV]Buying Feed G)(单调队列优化DP)
题目链接:P4544 [USACO10NOV]Buying Feed G 建议做这题前先做下这题P1886 滑动窗口 /[模板]单调队列 我们可以用dp[i][j]表示当前走到前i个点,已经买了j吨饲 ...
- NYOJ 248 BUYING FEED (贪心)
BUYING FEED 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up K ...
- bzoj 1676: [Usaco2005 Feb]Feed Accounting 饲料计算(差分)
1676: [Usaco2005 Feb]Feed Accounting 饲料计算 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 252 Solved ...
最新文章
- LIME:一种解释机器学习模型的方法
- UA OPTI512R 傅立叶光学导论16 Nyquist-Shannon采样定理
- MapReduce Java API实例-排序
- 解决SurfaceView渲染的各种疑难杂症
- 《ASP.NET Core 微服务实战》-- 读书笔记(第9章)
- Caffe中的卷积实现
- javascript 执行效率 java_有效提高JavaScript执行效率的几点知识
- JSOI2018冬令营游记总结(迁移自洛谷博客)
- VS2010中的sln,suo分别是什么含义
- Python 之 向上取整、向下取整以及四舍五入函数
- 服务端(Win server2012)+IIS管理器配置PHP服务器并部署网站讲解
- 非常全面详细的Sklearn介绍
- Gameplay框架
- 算数运算,逻辑运算,算术右移,逻辑右移
- 序列化版本号(serialVersionUID)是做什么用的
- CodeUp-1036 Problem B	镂空三角形
- xmanager5链接linux配置,xmanager连接linux5的方法
- JavaScript的callee 属性
- 控制工程/机器人SLAM/机器视觉/避障导航/求职笔记
- SC系列(SC-12S)低频率小型SMD石英晶振SC-12S32.768KHZ12.5PF/20PPM
热门文章
- python爬虫:get_text()等方法获取标签数据
- 【Three.js】关于Three.js的辅助库ststs.js报错的解决方案
- 我收集的网上公开的免费电子书
- 五笔字根表识别码图_精选五笔输入法拆字原则,值得收藏
- android短信照片换ios9,iOS9不越狱恢复短信和照片方法说明
- php自定义控件,小程序自定义组件的实现方法(代码)
- java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)
- SpringBoot如何使用策略模式干掉if else
- jquery怎么获取radio的值
- 用Python防止头上一片青青草原