HDU 4122 单调队列

转载自: http://blog.csdn.net/lvshubao1314/article/details/46910271

DES :给出n个订单和m是商店的开放时间。然后n行给出n个订单的信息。然后给出t和s。表示一个月饼的保质期和保存一天的成本。最后m行,给出每个时刻做月饼的成本。问。完成订单的最少的成本是多少。

思路就是用单调队列保存每个点之前的可以为这个点做月饼的点。刚学了单调队列。在保存下标然后找到值哪里还是有一些混乱。

第一次错了。闰年是366天。搞混了。T_T。不过时间方面的计算还是。。有点蠢。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int time[2600];
 8 int cost[100010];
 9 int order[2600];
10 int inque[100010];
11 
12 char mon[13][5] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
13 
14 bool isleap(int year) {
15      if (year%400 == 0)
16         return true;
17      else if (year%100 && (year%4==0))
18         return true;
19      return false;
20 }
21 
22 int year_Day(int year) {
23     int ans = 0;
24     for (int i=2000; i<year; ++i) {
25         if (isleap(i)) ans += 366;
26         else ans += 365;
27     }
28     return ans;
29 }
30 
31 int mon_Day(bool leap, int mon) {
32    switch (mon) {
33        case 1: return 0;
34        case 2: return 31;
35        case 3: return leap ? 60 : 59;
36        case 4: return leap ? 91 : 90;
37        case 5: return leap ? 121 : 120;
38        case 6: return leap ? 152 : 151;
39        case 7: return leap ? 182 : 181;
40        case 8: return leap ? 213 : 212;
41        case 9: return leap ? 244 : 243;
42        case 10: return leap ? 274 : 273;
43        case 11: return leap ? 305 : 304;
44        case 12: return leap ? 335 : 334;
45    }
46 }
47 
48 int get_mnum(char monn[]) {
49     for (int i=0; i<12; ++i) {
50         if (strcmp(monn, mon[i]) == 0)
51             return i+1;
52     }
53 }
54 
55 int getTime(char mon[], int dat, int year, int h) {
56     bool leap = isleap(year);
57     int ans = year_Day(year);
58     int m = get_mnum(mon);
59     ans += mon_Day(leap, m);
60     ans += dat-1;
61     ans *= 24;
62     ans += h;
63     return ans;
64 }
65 
66 int main() {
67     int n, m;
68     int t, s;
69     char monn[5];
70     int dat, year, h, r;
71     while(cin >> n >> m) {
72         if (n == 0 && m == 0) break;
73         for (int i=0; i<n; ++i) {
74             cin >> monn >> dat >> year >> h >> r;
75             time[i] = getTime(monn, dat, year, h);
76             //cout << time[i] << endl;
77             order[i] = r;
78         }
79         cin >> t >> s;
80         int tnum = 0;
81         int ans = 0;
82         int head=0, tail=0;
83         for (int i=0; i<m; ++i) {
84             cin >> cost[i];
85             while(head < tail && cost[inque[tail-1]]+s*(i-inque[tail-1]) > cost[i])
86                 tail--;
87             inque[tail++] = i;
88             while(i == time[tnum]) {
89               while(head<tail && i-inque[head]>t)
90                   head++;
91               ans += order[tnum]*(cost[inque[head]]+s*(i-inque[head]));
92               tnum++;
93            }
94         }
95         cout << ans << endl;
96     }
97     return 0;
98 }
View Code
原文地址:https://www.cnblogs.com/icode-girl/p/4863609.html