题意:
      有一个加工厂加工月饼的,这个工厂一共开业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. ZOJ3715 竞选班长求最小花费

    题意:       有n个小朋友竞选班长,一号想当班长,每个人都必须选择一个人当班长,并且不可以选择自己,并且每个人都有一个权值ai,这个权值就是如果1想让这个人改变主意选择自己当班长就得给他ai个糖 ...

  2. LeetCode-动态规划基础题-746. 使用最小花费爬楼梯

    描述 746.使用最小花费爬楼梯 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始). 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应 ...

  3. 1230: 最小花费(spfa)

    1230: 最小花费 时间限制: 1 Sec 内存限制: 128 MB 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除 ...

  4. LeetCode Algorithm 746. 使用最小花费爬楼梯

    746. 使用最小花费爬楼梯 Ideas 首先确定题目类型,爬楼梯问题,并且给定了状态转移的限制,其实就已经可以确定状态转移方程了. 然后题目说可以从下标为0或下标为1的台阶开始爬,所以我们可以定义两 ...

  5. 【例4-4】最小花费

    [例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344 时间限制: 1000 ms         内存限制: 65536 ...

  6. 算法题目——使用最小花费爬楼梯(动态规划)

    题目链接:746.使用最小花费爬楼梯 方法:动态规划 假设数组cost的长度为n,则n个阶梯分别对应下标0到n- 1,楼层顶部对应下标n,问题等价于计算达到下标n的最小花费.可以通过动态规划求解. 创 ...

  7. 【最短路】【Dijkstra】【图论】最小花费(jzoj 2125)

    最小花费 题目大意: n个人,一些人之间可以相互转账,但又手续费x%,问A转给B100元至少要多少钱 样例输入 3 3 1 2 1 2 3 2 1 3 3 1 3 样例输出 103.07153164 ...

  8. 【图论】【最短路】【Dijkstra】最小花费(ssl 2206/luogu 1576)

    最小花费 ssl 2206 luogu 1576 题目大意: 有n个人,他们之间有m对人可以相互{\color{red}相互}相互转账,但要收一定的税,求第x个人转给第y个人至少要多少钱 Descri ...

  9. 746. 使用最小花费爬楼梯 golang 动态规划

    746. 使用最小花费爬楼梯 746. 使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi. 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以 ...

最新文章

  1. 科大星云诗社动态20210224
  2. OpenCASCADE可视化:3D演示之创建3D场景
  3. Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
  4. gradle入门_Gradle入门:集成测试
  5. matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解
  6. pdf形式是什么意思
  7. 三次握手的本质_动画讲解TCP的3次握手,4次挥手,让你一次看明白
  8. 移动电话用户突破6亿大关
  9. Sosoapi本地项目搭建
  10. Kubernetes(K8s)学习笔记(一)
  11. Vue 移动端 股票 分时 K线
  12. 一文说清楚什么是时区,夏令时,GMT和CST
  13. 嘉和生物药业(开曼)控股有限公司于香港联交所主板成功上市
  14. 深度学习之残差网络原理深度刨析
  15. 键盘输入,大写字母变小写,小写变大写
  16. “健康童乐园”10000户落成促进乡村儿童身心智全面健康成长
  17. 皮卡丘(pikachu)敏感信息泄露
  18. Ng机器学习 Week8 Unsupervised Learning
  19. SpringBoot+Vue+ElementUI实现后台管理系统
  20. 调度增益控制基础概念Gain Scheduling Basics学习笔记

热门文章

  1. 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解
  2. CentOS Linux解决Device eth0 does not seem to be present
  3. Java HashMap遍历的两种方式
  4. ZJU PAT 1027 Colors in Mars
  5. 转:Linux查看CPU信息、机器型号等硬件信
  6. mapreduce原理
  7. input type=file change事件只触发一次
  8. 【给自己的小练习2-线段树】
  9. 8.Layout布局应用
  10. 如何将四个一字节的数转换为一个四字节数