题意:

      有一个加工厂加工月饼的,这个工厂一共开业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 制作月饼完成订单的最小花费的更多相关文章

  1. Poj 2516 Minimum Cost (最小花费最大流)

    题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...

  2. 把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

    //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend //dp[i][j]:把第i个数转成第j小的数,最小花费 //此题与po ...

  3. 把一个序列转换成非严格递增序列的最小花费 POJ 3666

    //把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...

  4. 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

    [问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...

  5. 九度OJ 1086 最小花费--动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1086 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对 ...

  6. hdoj 3072 Intelligence System【求scc&&缩点】【求连通所有scc的最小花费】

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. ccf 201503-5 最小花费 这题交上去只有10分嗨!求大佬的题解啊

    问题描述 C国共有n个城市.有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti.在旅行过程中,小R ...

  8. [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 ...

  9. 1344:【例4-4】最小花费 dijkstra

    1344:[例4-4]最小花费 Dijkstra (1)a [ i ] [ j ] 存转账率(..转后所得率..) (2)dis [ i ] 也就是 a [ 起点 ] [ i ] (3)f [ i ] ...

随机推荐

  1. double型数据的输入和输出--%f和%lf

    scanf函数是通过指针指向变量的. %f告诉scanf函数在所传地址位置上存储一个float型值, 而%lf告诉scanf函数在所传地址位置上存储一个double型值. 这里float和double ...

  2. Image Super-Resolution via Sparse Representation——基于稀疏表示的超分辨率重建

    经典超分辨率重建论文,基于稀疏表示.下面首先介绍稀疏表示,然后介绍论文的基本思想和算法优化过程,最后使用python进行实验. 稀疏表示 稀疏表示是指,使用过完备字典中少量向量的线性组合来表示某个元素 ...

  3. Linux速通 大纲

    1.Linux操作系统安装及初始化配置(熟悉) 2.Linux操作系统目录组成结构及文件级增删改查操作(重点) 3.Linux操作系统用户.权限管理(重点) 4.开源软件及Linux下软件包的管理(重 ...

  4. Java 语言基础 02

    语言基础·二级 顺序结构语句 * A:什么是流程控制语句    * 流程控制语句:可以控制程序的执行流程. * B:流程控制语句的分类    * 顺序结构    * 选择结构    * 循环结构 *  ...

  5. 技术基础 | 在Apache Cassandra中改变VNodes数量的影响

    Apache Cassandra中num_tokens的默认值在4.0版本中将会有变化!这看起来好像只是在CHANGES.txt文件中做了个小小的改动,但实际上这个改动将会对集群的日常运维有着深远的影 ...

  6. Oracle数据库搬家牵扯出的一些知识点记录

    Oracle数据库迁移过程中的一些记录 工作原因,对开发服务器的数据库进行了迁移,实际执行操作之前查了一下迁移oracle数据库的可行方案,最后用了 exp/imp 进行导出导入(这个比较简单),以及 ...

  7. FreeBSD——艺术、科学、哲学概论

    FreeBSD--艺术.科学.哲学概论→→→→→概论: 信息都有一定的时效性.那么现在是什么时间?现在已经发布了 FreeBSD 12.2,距离下一个版本 13.0 还有约 4 个月. 『约定』 使用 ...

  8. [SNOI2019] 通信

    一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...

  9. where / having / group by / order by / limit 简单查询

    目录 1.基础查询 -- where 2. group by 与 统计函数 3. having 4.where + group by + having + 函数 综合查询 5. order by + ...

  10. 翻译:《实用的Python编程》06_02_Customizing_iteration

    目录 | 上一节 (6.1 迭代协议) | 下一节 (6.3 生产者/消费者) 6.2 自定义迭代 本节探究如何使用生成器函数自定义迭代. 问题 假设你想要自定义迭代模式. 例如:倒数: >&g ...