转载自: 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 }