hdu4122 制作月饼完成订单的最小花费
题意:
有一个加工厂加工月饼的,这个工厂一共开业m小时,2000年1月1日0点是开业的第一个小时,每个小时加工月饼的价钱也不一样,然后每个月饼的保质期都是t天,因为要放在冰箱里保存,所以在保质期期间每天每个月饼的花费是s,他接到了n个订单,问你完成这n个订单的最小花费是多少?
思路:
想到这样一个性质,在一个序列里面某一个位置的值是由他前面的某一个范围中的一个得到的,而且我们要当前这个位置最小(或者最大),这样的问题可以用单调队列解决,这个题目我们可以弄一个递增的单调队列,小的那头要保证不过期,大的那头要保证递增,这样就ok了,还有对于这个题目,我的方法是吧所有的订单日期全都处理成小时(就是于题目中的m对应)去做,这样能清晰点,还有就是有两个小提示,订单当天做也来得及,还有一个就是两个订单的日期可能相同,别的没什么了,具体细节看下面代码。
#include<map>
#include<string>
#include<stdio.h>
#include<string.h>
#define N 2500 + 50
using namespace std;
map<__int64 ,__int64>mark;
map<string ,int>mk;
__int64 ry[13] = {0 ,31 ,29 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31};
__int64 py[13] = {0 ,31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31};
__int64 C[110000] ,node[N];
__int64 hash[110000];
int Q[110000];
__int64 tou ,wei;
void DB()
{
mk["Jan"] = 1; mk["Feb"] = 2; mk["Mar"] = 3;
mk["Apr"] = 4; mk["May"] = 5; mk["Jun"] = 6;
mk["Jul"] = 7; mk["Aug"] = 8; mk["Sep"] = 9;
mk["Oct"] = 10; mk["Nov"] = 11; mk["Dec"] = 12;
}
bool jude(__int64 now)
{
return now % 400 == 0 || now % 4 == 0 && now % 100 != 0;
}
void insert(int t ,__int64 tt,__int64 cost)
{
for(int i = wei ;i > tou ;i --)
{
if(C[t] <= (__int64)(t - Q[wei]) * cost + C[Q[wei]])
wei --;
else break;
}
Q[++wei] = t;
for(int i = tou + 1;i <= wei ;i ++)
if(t - Q[i] > tt) tou ++;
}
int main ()
{
int n ,m ,a ,i;
__int64 y ,r ,h ,t ,cost;
char mouse[10];
DB();
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
mark.clear();
for(i = 1 ;i <= n ;i ++)
{
scanf("%s %I64d %I64d %I64d %I64d" ,mouse ,&r ,&y ,&h ,&node[i]);
__int64 now = mk[mouse] * 10000 + y * 1000000 + r * 100 + h * 1;
if(mark[now]) node[mark[now]] += node[i];
else mark[now] = i;
}
memset(hash ,0 ,sizeof(hash));
__int64 nn = 2000,yy = 1 ,rr = 1,ss = 0;
if(mark[nn*1000000+yy*10000+rr*100+ss*1])
{
hash[1] = mark[nn*1000000+yy*10000+rr*100+ss*1];
}
for(i = 2 ;i <= m ;i ++)
{
ss ++;
if(ss == 24) {ss = 0 ,rr ++;}
if(jude(nn) && rr == ry[yy] + 1 || !jude(nn) && rr == py[yy] + 1)
{yy ++ ,rr = 1;}
if(yy == 13) {yy = 1 ;nn ++;}
if(mark[nn*1000000+yy*10000+rr*100+ss*1])
hash[i] = mark[nn*1000000+yy*10000+rr*100+ss*1];
}
scanf("%I64d %I64d" ,&t ,&cost);
for(i = 1 ;i <= m ;i ++)
scanf("%I64d" ,&C[i]);
tou = wei = 0;
__int64 Ans = 0;
for(i = 1 ;i <= m ;i ++)
{
insert(i ,t ,cost);
if(hash[i])
{
int T = Q[tou + 1];
Ans += C[T] * node[hash[i]] + node[hash[i]] * (__int64)(i - T) * cost;
}
}
printf("%I64d\n" ,Ans);
}
return 0;
}
hdu4122 制作月饼完成订单的最小花费的更多相关文章
- Poj 2516 Minimum Cost (最小花费最大流)
题目链接: Poj 2516 Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...
- 把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend
//把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend //dp[i][j]:把第i个数转成第j小的数,最小花费 //此题与po ...
- 把一个序列转换成非严格递增序列的最小花费 POJ 3666
//把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...
- 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解
[问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...
- 九度OJ 1086 最小花费--动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1086 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对 ...
- hdoj 3072 Intelligence System【求scc&&缩点】【求连通所有scc的最小花费】
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- ccf 201503-5 最小花费 这题交上去只有10分嗨!求大佬的题解啊
问题描述 C国共有n个城市.有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti.在旅行过程中,小R ...
- [LeetCode] Minimum Cost to Merge Stones 混合石子的最小花费
There are N piles of stones arranged in a row. The i-th pile has stones[i] stones. A move consists ...
- 1344:【例4-4】最小花费 dijkstra
1344:[例4-4]最小花费 Dijkstra (1)a [ i ] [ j ] 存转账率(..转后所得率..) (2)dis [ i ] 也就是 a [ 起点 ] [ i ] (3)f [ i ] ...
随机推荐
- Hi3559AV100-自己编译了u-boot、kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路
这篇随笔主要给出了Hi3559AV100-自己编译了u-boot.kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路. 问题 (1)对于 u-boot 为官方的,kernel ...
- Elastic App Search 快速构建 ES 应用
公号:码农充电站pro 主页:https://codeshellme.github.io App Search 是 Elastic 家族中的一个产品,它可以帮助我们(基于 ES)快速高效的构建搜索应用 ...
- [UWP] 模仿哔哩哔哩的一键三连
1. 一键三连 什么是一键三连? 哔哩哔哩弹幕网中用户可以通过长按点赞键同时完成点赞.投币.收藏对UP主表示支持,后UP主多用"一键三连"向视频浏览者请求对其作品同时进行点赞.投币 ...
- FreeBSD WIFI 配置
ee /boot/ loader.conf ee是个编辑器 中写入 rtwn_usb_load="YES" legal.realtek.license_ack=1 在 /etc/ ...
- python学习之类的装饰器进阶版
装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func): print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...
- 前端性能监控之performance
如果我们想要对一个网页进行性能监控,那么使用window.performance是一个比较好的选择. 我们通过window.performance可以获取到用户访问一个页面的每个阶段的精确时间,从而对 ...
- C++11多线程编程(常见面试题)
[题目1] 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码 [题解] 首先我们来分析一下这道题...( ...
- Hive中静态分区和动态分区总结
目录 背景 第一部分 静态分区 第二部分 动态分区 第三部分 两者的比较 第四部分 动态分区使用的问题 参考文献及资料 背景 在Hive中有两种类型的分区:静态分区(Static Partitioni ...
- 互联网开发工具之idea项目打jar包
一.idea打jar包 步骤一:创建一个简单的java项目:如下图所示 `public class Main { public static void main(String[] args) { Sy ...
- 解决“用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示”的问题记录(备忘)
解决"用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示"的问题记录(备忘) 历时几个小时百度,终于靠自己理解解决了GitHub仓库图 ...