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. Android裁剪固定大小头像的功能

    转载自: http://www.eoeandroid.com/thread-497277-1-1.html 效果很好,特意转载过来记录一下,加深一下印象. 效果就是 :中间的方框不动,可以拖动图片,选 ...

  2. 把一个类(或者Object)转换成字典

    直接上代码:把一个类转换成object,然后在转换成字典 internal static IDictionary<string, string> GetDictionary(this ob ...

  3. XAMPP for Linux

     XAMPP 的 Linux 版图片集锦 安装过程仅 4 个步骤  步骤 1:下载 XAMPP PHP 5.4 XAMPP PHP 5.5  步骤 2:安装  步骤 3:开始运行  步骤 4:测试 使 ...

  4. [Papers]NSE, $\p_3u$, Lebesgue space [Kukavica-Ziane, JMP, 2007]

    $$\bex \p_3\bbu\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=2,\quad \frac{9}{4}\leq q\leq ...

  5. MyBatis 物理分页

    MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函 ...

  6. JUC之Atomic系列12大类实例讲解和原理分解

    在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的AB ...

  7. How to enable DateTimePicker to use both date and time z

    Recently in one of my project I needed to have an option to display the DateTimePicker allowing user ...

  8. webdriver(python)学习笔记四——定位一组元素

    webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用find_elements方法. 定位一组对象一般用于以下场景: ...

  9. Team them up!

    题意: 给出n个人以及认识其他人的情况,现在要把所有人分成两队,每队至少一人,求使两队人数差距最小且每队内部的人都相互认识的分队情况. 分析: 这道题让我学习到了不少,首先看到使差距最小就想到了背包, ...

  10. 关于【bootstrap】中,【tooltip】的不算bug的bug的个人看法

    先说下遇到这个问题的背景吧. 就是在页面中有个div,这个div右上角(或者其他位置)有个 × 的图标(这个图标添加tooltip工具提示),光标移到这个图标时,触发tooltip,提示“点击移除”这 ...