Alice's mooncake shop HDU - 4122 单调队列
题意:
有n个订单和可以在m小时内制作月饼,制作月饼不考虑时间(即,你可以在一个时刻在所有需要的月饼都做完)
接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼
接下来一行t,s表示制作的月饼可以保质t小时,每保质一小时需要花费s的价值
接下来m行表示从第0小时开始在该时间制作月饼的花费的价值(2000年1月1日0时表示第0个小时)
求完成所有订单消耗的最小价值
题解:
因为题目中给的时间是年月日的,所以我们首先要把它转化为距离2000年1月1日0时多少小时
然后又因为我们需要求最小花费,对于一个订单,你可以在该订单结束的时刻(设为距离2000年1月1日0时x小时)的区间[0,x]内中选择花费最少的一天去制作月饼。
这就可以用到单调队列,构造一个从左向右递增的序列即可。这样的话对于x时刻的月饼,我们只需要找到单调队列中那个最左边满足题意得就可以了
如果这样的话,那么这个单调队列按照从左向右递增的这个值就要考虑到保质花费,和在那个时刻做月饼得花费。具体见代码吧
代码:
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <iostream>
5 #include <algorithm>
6 #include<map>
7 using namespace std;
8 typedef long long LL;
9 typedef unsigned long long ull;
10 const int inf=0x3f3f3f3f;
11 const LL INF=0x3f3f3f3f3f3f3f3fll;
12 const int maxn=1e5+5;
13 map<string,int>mp;
14 int n,m,time[3050],sum[15],S,T,cost[100050],q[100050];
15 LL num[3000];
16 void init()
17 {
18 mp["Jan"]=1,mp["Feb"]=2,mp["Mar"]=3,mp["Apr"]=4,mp["May"]=5,mp["Jun"]=6,mp["Jul"]=7,mp["Aug"]=8;
19 mp["Sep"]=9,mp["Oct"]=10,mp["Nov"]=11,mp["Dec"]=12;
20 sum[0]=0,sum[1]=31,sum[2]=sum[1]+28,sum[3]=sum[2]+31,sum[4]=sum[3]+30,sum[5]=sum[4]+31,sum[6]=sum[5]+30;
21 sum[7]=sum[6]+31,sum[8]=sum[7]+31,sum[9]=sum[8]+30,sum[10]=sum[9]+31,sum[11]=sum[10]+30;
22 }
23
24 int get(int y,int m,int d,int t) //获取这个时间对应的2000年1月1日0点有多少小时
25 {
26 int ans=0;
27 for(int i=2000; i<y; i++)
28 {
29 if((i%4==0&&i%100!=0)||i%400==0)
30 ans+=366;
31 else
32 ans+=365;
33 }
34 if((y%4==0&&y%100!=0)||y%400==0)
35 {
36 ans+=sum[m-1];
37 if(m-1>=2)ans++;
38 }
39 else
40 {
41 ans+=sum[m-1];
42 }
43 ans+=(d-1);
44 return ans*24+t;
45 }
46
47 int main()
48 {
49 init();
50 while(~scanf("%d%d",&n,&m))
51 {
52 if(n==0&&m==0)break;
53 for(int i=0; i<n; i++)
54 {
55 int year,day,t;
56 char mon[10];
57 scanf("%s%d%d%d%I64d",mon,&day,&year,&t,&num[i]);
58 time[i]=get(year,mp[mon],day,t);
59 //printf("->%d\n",time[i]);
60 }
61 scanf("%d%d",&T,&S);
62 int tail=0,head=0,k=0;
63 LL cnt=0;
64 for(int i=0; i<m; i++)
65 {
66 scanf("%d",&cost[i]);
67 /*
68 维护一个递增的序列,这个递增的值是花费多少才能使月饼保存到第i个小时
69 */
70 while(head<tail&&cost[q[tail-1]]+S*(i-q[tail-1])>=cost[i])tail--;
71 q[tail++]=i;
72 while(i==time[k]) //当这个条件触发时,就可以从单调队列中拿出来你从0时刻到现在那个最小的花费
73 { //但是还要判断一下保鲜时间超时了没有
74 while(head+1<tail&&(i-q[head]>T))head++;
75 cnt+=num[k]*(cost[q[head]]+S*(i-q[head]));
76 k++;
77 }
78 }
79 printf("%I64d\n",cnt);
80 }
81 return 0;
82 }
Alice's mooncake shop HDU - 4122 单调队列的更多相关文章
- HDU 4122 单调队列
转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...
- 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 ...
- 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 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- hdu 3530 单调队列最值
/** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...
- 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 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
随机推荐
- Flutter 应用入门:路由管理
路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewContro ...
- MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)
数据准备 数据表 CREATE TABLE `teacher`( id INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY ( ...
- MySQL select 查询之分组和过滤
SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][ ...
- 天天用SpringBoot居然还不知道它的自动装配的原理?
引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...
- Poj-P3468题解【线段树】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: http://poj.org/problem?id=3468 题目描述: 给N个数A1, A2 ...
- 15V转5V转3.3V转3V芯片,DC-DC和LDO
15V电压是属于一般电压,降压转成5V电压,3.3V电压和3V电压,适用于这个电压的DC-DC很多,LDO也是有可以选择的.LDO芯片如PW6206,PW8600等.DC-DC芯片如:PW2162,P ...
- Amazon Selling Partner API 开发笔记
资料整理 1.sp-api介绍:https://developer.amazonservices.com/ 2.github文档:https://github.com/amzn/selling-par ...
- Typora+PicGo+Gitee打造图床
前言 自己一直使用的是Typora来写博客,但比较麻烦的是图片粘贴上去后都是存储到了本地,写好了之后放到博客园等地,图片不能直接访问,但如今Typora已经支持图片上传,所以搞了一波图片上传到Gi ...
- ELK (elasticsearch+kibana+logstash+elasticsearch-head) 华为云下载地址
https://mirrors.huaweicloud.com/elasticsearch https://mirrors.huaweicloud.com/kibana https://mirrors ...
- libuv工作队列
目录 1.说明 2.API 2.1.uv_queue_work 2.2.uv_cancel 3.代码示例 1.说明 libuv 提供了一个线程池,可用于运行用户代码,libuv 中的工作队列中的任务会 ...