题意:

有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 单调队列的更多相关文章

  1. HDU 4122 单调队列

    转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...

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

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

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

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

  5. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  6. hdu 3530 单调队列最值

    /** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...

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

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

  8. HDU 4122 Alice's mooncake shop

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

  9. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

随机推荐

  1. 剑指offer-查找数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  2. 你都用过SpringCloud的哪些组件,它们的原理是什么?

    前言 看到文章的题目了吗?就是这么抽象和笼统的一个问题,确实是我面试中真实被问到的,某共享货车平台的真实面试问题. SpringCloud确实是用过,但是那是三四年前了,那个时候SpringCloud ...

  3. JAR冲突问题的解决以及运行状态下如何查看加载的类

    今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪一个? 在说如何看之前,先来说说,当你开始意识到项目里有多个不同版本的Jar包,都是因为遇到了这几个异常: java ...

  4. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  5. ichartjs测试dome分享

    效果如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> ...

  6. centos 7.0 ping百度提示:ping: www.baidu.com: Name or service not known

    解决方法一: 添加dns服务器 vi /etc/resolv.conf 在文件中添加如下两行: nameserver 8.8.8.8 nameserver 8.8.4.4 保存退出,重启服务器.之后再 ...

  7. 浅析Linux用户空间中的Mmap

    一.MMap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采 ...

  8. mysql主从复制安装配置

    mysql主从复制安装配置 基础设置准备 #操作系统: centos6.5 #mysql版本: 5.7 #两台虚拟机: node1:192.168.182.111(主) node2:192.168.1 ...

  9. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  10. 1.kafka基础架构

    kafka基础架构 ## 什么是kafka? Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域. 1.什么是消息队列? 2.使用消息队列的好处 1)解耦 允许你独立的 ...