Alice's mooncake shop

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=4122

Description

The Mid-Autumn Festival, also known as the Moon Festival or Zhongqiu Festival is a popular harvest festival celebrated by Chinese people, dating back over 3,000 years to moon worship in China's Shang Dynasty. The Zhongqiu Festival is held on the 15th day of the eighth month in the Chinese calendar, which is in September or early October in the Gregorian calendar. It is a date that parallels the autumnal equinox of the solar calendar, when the moon is at its fullest and roundest.

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

The input contains no more than 10 test cases.
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

1 10 Jan 1 2000 9 10 5 2 20 20 20 10 10 8 7 9 5 10 0 0

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的更多相关文章

  1. hdu 4122 Alice's mooncake shop(单调队列)

    题目链接:hdu 4122 Alice's mooncake shop 题意: 有n个订单和可以在m小时内制作月饼 接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼 接 ...

  2. 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 ...

  3. HDU 4122 Alice's mooncake shop (单调队列/线段树)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4122 题意:好难读懂,读懂了也好难描述,亲们就自己凑合看看题意把 题解:开始计算每个日期到2000/1/ ...

  4. HDU 4122 Alice's mooncake shop

    单调队列,裸的!!坑死了,说好的“All the orders are sorted by the time in increasing order. 呢,我就当成严格上升的序列了,于是就各种错.测试 ...

  5. 【HDU】3401:Trade【单调队列优化DP】

    Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. HDU 4122 Alice's mooncake shop --RMQ

    题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从 ...

  7. hdu 3415 Max Sum of Max-K-sub-sequence 单调队列优化DP

    题目链接: https://www.cnblogs.com/Draymonder/p/9536681.html 同上一篇文章,只是 需要记录最大值的开始和结束的位置 #include <iost ...

  8. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  9. 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 ...

随机推荐

  1. Blog CSS

    你好 print("你好.") haode

  2. 【转】有趣的Autolayout示例-Masonry实现

    原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/ 好久没有写Blog了,这段时间有点忙啊=.=本文举了3个比较有“特点 ...

  3. shell小技巧

    # awk '{a[$1]++;a[$2]++}END{for (i in a)print i "\t" a[i]}' list | grep -w 2 | awk '{print ...

  4. ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)

    我的个人博客站在使用百度富文本编辑器UEditor修改文章时,遇到了一些问题,(不知是bug,还是我没有配置好).但总算找到了解决方法,在此记录下来. 小站首页文章列表显示为(显示去除HTML标签后的 ...

  5. ZOJ 3879 Capture the Flag

    以此题纪念我写的第一篇acm博客,第一道模拟:) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3879 题意非常复杂,感觉 ...

  6. 七中滤波方法测试matlab实现

    http://blog.163.com/xiaheng0804@126/blog/static/1205282120132129471816/ 创建两个混合信号,便于更好测试滤波器效果.同时用七中滤波 ...

  7. Another Crisis

    题意: 给出一个树,当孩子节点为1的数量占孩子总数的T%时父节点变成1,求使根节点变成1需要叶子节点为1的最小数量. 分析: 简单的树状dp,dp[i]以i为根的子树所需的最小数量,取它所有子树中最小 ...

  8. 【LeetCode 208】Implement Trie (Prefix Tree)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  9. ASP.NET MVC3 系列教程 – Web Pages 1.0

    http://www.cnblogs.com/highend/archive/2011/04/14/aspnet_mvc3_web_pages.html I:Web Pages 1.0中以“_”开头的 ...

  10. [Hive - Tutorial] Data Units 数据存储单位

    Data Units In the order of granularity - Hive data is organized into: 数据库.表.分区.桶 Databases: Namespac ...