• 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
  • 相关阅读:
    《C语言》for语句(8)
    解决vue vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in nextTick: “TypeError: Cannot convert undefine
    React中WebSocket使用以及服务端崩溃重连
    React Native 中 react-navigation 导航器的使用 [亲测可用]
    ueditor 修改内容方法报错no funtion解决方式
    nodeJs与elementUI实现多图片上传
    Vue多页面开发案例
    Vue.js Cli 3.0 多页面开发案例解析
    基于node.js 微信支付notify_url回调接收不到xml
    react-image-gallery 加入视频图片混合显示
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4863609.html
Copyright © 2020-2023  润新知