HDU 4122 Alice's mooncake shop 单调队列优化dp
Alice's mooncake shop
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=4122
Description
The
traditional food of this festival is the mooncake. Chinese family
members and friends will gather to admire the bright mid-autumn harvest
moon, and eat mooncakes under the moon together. In Chinese, “round”(圆)
also means something like “faultless” or “reuion”, so the roundest moon,
and the round mooncakes make the Zhongqiu Festival a day of family
reunion.
Alice has opened up a 24-hour mooncake shop. She always
gets a lot of orders. Only when the time is K o’clock sharp( K = 0,1,2
…. 23) she can make mooncakes, and We assume that making cakes takes no
time. Due to the fluctuation of the price of the ingredients, the cost
of a mooncake varies from hour to hour. She can make mooncakes when the
order comes,or she can make mooncakes earlier than needed and store them
in a fridge. The cost to store a mooncake for an hour is S and the
storage life of a mooncake is T hours. She now asks you for help to work
out a plan to minimize the cost to fulfill the orders.
Input
For each test case:
The first line includes two integers N and M. N is the total number of orders. M is the number of hours the shop opens.
The next N lines describe all the orders. Each line is in the following format:
month date year H R
It means that on a certain
date, a customer orders R mooncakes at H o’clock. “month” is in the
format of abbreviation, so it could be "Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov" or "Dec". H and R are
all integers.
All the orders are sorted by the time in increasing order.
The next line contains T and S meaning that the storage life
of a mooncake is T hours and the cost to store a mooncake for an hour is
S.
Finally, M lines follow. Among those M lines, the i th line( i starts from 1) contains a integer indicating the cost to make a mooncake during the i th hour . The cost is no more than 10000. Jan 1st 2000 0 o'clock belongs to the 1 st hour, Jan 1st 2000 1 o'clock belongs to the 2 nd hour, …… and so on.
(0<N <= 2500; 0 < M,T <=100000; 0<=S <= 200; R<=10000 ; 0<=H<24)
The input ends with N = 0 and M = 0.
Output
You should output one line for each test case: the minimum cost.
Sample Input
Sample Output
70
HINT
题意
Alice开了家月饼店,现有2500笔订单,订单包括某小时(2000年1月1日0点算第1个小时的开始)和需要的月饼数量。然后给你前100000小时的信息,包括第i个小时做1个饼的花费cost[i]。然后给你月饼的保质期T(说明订单i只能买[order[i].hour-T ,order[i].hour ]这个区间生产的饼)和保存1小时的花费S,让你求最小的花费满足所有订单。
题解:
首先要把订单的时间转化成自2000年1月1日0点开始的第几小时,由于最多100000小时,所以最大到2012年的样子。然后维护一个最小值的单调队列。
具体实现:
首先我们已经获得第一个Order的单调队列,记为LQ,然后是处理第2个订单,我们把LQ分成2个部分。A:下标在order[2].hour-T, order[1].hour范围(A集合可能为空) B:下标在order[1].hour , order[2].hour的范围。对于A,由于第2个订单也可能使用到A集合里面的元素,所以我们要先对A集合所有元素加上1.2订单时间差的花费S*(order[2].hour- order[1].hour)(用于保存),然后再把B集合的元素加到单调队列里面,最后队列头的值即为第2个订单得到一个饼的最小花费,乘以订单数即可。之后的每个订单同样处理即可。注意,答案要long long。
http://altynai.me/2011/11/hdu-4121-4123/
代码
#include<iostream>
#include<stdio.h>
#include<vector>
#include<deque>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
long long ans = ;
string mon[]={"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov","Dec"};
int day[]={, , , , , , , , , , , , };
string M;
int d,y,h,num;
long long time[];
deque<pair<int,int> > QQ;
queue<pair<int,int> > Q;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int tot = ;
if(n==&&m==)break;
while(!QQ.empty())QQ.pop_back();
while(!Q.empty())Q.pop();
memset(time,,sizeof(time));
for(int i=;i<n;i++)
{
cin>>M;
scanf("%d%d%d%d",&d,&y,&h,&num);
for(int j=;j<y;j++)
{
if(( j % == && j % ) || j % == )d += ;
else d += ;
}
int k;
for(k=;k<=;k++)
if(mon[k]==M)
break;
for(int j=;j<k;j++)
{
if(j== &&( ( y % == && y % ) || y % == ))
d += ;
else
d += day[j];
}
d--;
Q.push(make_pair(num,d*+h));
} int T,S;
scanf("%d%d",&T,&S);
long long ans = ;
for(int i=;i<m;i++)
{
int x;
scanf("%d",&x);
while(!QQ.empty()&&x<=QQ.back().first + (i-QQ.back().second)*S)
QQ.pop_back();
QQ.push_back(make_pair(x,i));
while(!Q.empty()&&i==Q.front().second)
{
while(!QQ.empty() && QQ.front().second + T < i )
QQ.pop_front();
ans += (QQ.front().first + (i - QQ.front().second) * S) * Q.front().first;
Q.pop();
}
}
printf("%lld\n",ans);
}
}
HDU 4122 Alice's mooncake shop 单调队列优化dp的更多相关文章
- hdu 4122 Alice's mooncake shop(单调队列)
题目链接:hdu 4122 Alice's mooncake shop 题意: 有n个订单和可以在m小时内制作月饼 接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼 接 ...
- HDU 4122 Alice's mooncake shop (RMQ)
Alice's mooncake shop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 4122 Alice's mooncake shop (单调队列/线段树)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4122 题意:好难读懂,读懂了也好难描述,亲们就自己凑合看看题意把 题解:开始计算每个日期到2000/1/ ...
- HDU 4122 Alice's mooncake shop
单调队列,裸的!!坑死了,说好的“All the orders are sorted by the time in increasing order. 呢,我就当成严格上升的序列了,于是就各种错.测试 ...
- 【HDU】3401:Trade【单调队列优化DP】
Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 4122 Alice's mooncake shop --RMQ
题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从 ...
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列优化DP
题目链接: https://www.cnblogs.com/Draymonder/p/9536681.html 同上一篇文章,只是 需要记录最大值的开始和结束的位置 #include <iost ...
- 【单调队列优化dp】HDU 3401 Trade
http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
随机推荐
- HTML5全球普及加速:有望终结iOS与安卓界限【转】
HTML5或将成为未来移动互联网时代的颠覆者. 5年前,当第一台iPhone诞生时,乔布斯断然拒绝了FlashPlayer,而选择HTML5(新型网页标准)取代Flash的功能.他曾预言,“虽然现阶段 ...
- Oracle 课程三之表设计
完成本课程的学习后,您应该能够: •普通堆表优点和缺点 •理解rowid •全局临时表优点.缺点和适用场景 •分区表的类型和原理.优点和缺点.适用场景 •表字段的高效设计 •sequence的设计 ...
- Java—Map.Entry
Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法. keySet()方法返回值是Map中key值的集合:e ...
- getView 数据最后加一项
if (position != count-1) { viewHolder.imgLineEnd.setVisibility(View.GONE); } else { viewH ...
- Codeforces Round #361 (Div. 2) 套题
A - Mike and Cellphone 问有没有多解,每个点按照给出的序列用向量法跑一遍 #include<cstdio> #include<cstring> #incl ...
- Apache OFBiz 学习笔记 之 实体引擎
1.概述 entity engine和常见的ORM有一点很大的不同,他的mapping object只有一个 GenericEntity,称它的entity engine 为adaptive ...
- CSS选择器的兼容性
CSS 1 CSS2.1 CSS3 :hover 在IE6中只有a元素可用.E:empty 貌似在webkit核心浏览器中有些小bug.如果这个bug依然存在,不太确定如何测试.IE6不支持.clas ...
- 将iOS中Safari 的默认搜索引擎由google.cn改为google.com的方法
众所周知虽然Google大部分的业务已经迁出中国大陆,访问Google的中国站点只会出现一个投影网站,但是很长一段时间里如果想要访问Google仍然能跳转到google.com.hk这个香港的节点,这 ...
- angular form-data文件上传
前言:很久没更新博客,最近公司pc端技术选型用angular,这几天就赶鸭子上架,硬着头皮直接上手angular.其中有许多小坑陆陆续续踩起走.今天就遇到一个比较常见的问题:图片上传. 主题:图片上传 ...
- [Hive - LanguageManual] Select base use
Select Syntax WHERE Clause ALL and DISTINCT Clauses Partition Based Queries HAVING Clause LIMIT Clau ...