HDU 4122 Alice's mooncake shop 优先队列

题目大意:一个月饼店开m个小时(24小时营业),只在整点做月饼,做月饼的能力非常强。现在只需要考虑成本的问题。给m个cost值,cost[i]表示第i个小时做1个月饼的代价。

 
再给n个时间,从2000年1月1日0时开始计算。表示订单的截止时间。当然为了节约成本,可以提前趁成本不高的时候做月饼。但是月饼有保质期,t天,月饼放冰箱保存也需要代价,一天花费s。现在求完成n个订单最小代价。
思路:

水题嘛,写写写T^T




#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
template <class T>
inline bool rd(T &ret) {
	char c; int sgn;
	if(c=getchar(),c==EOF) return 0;
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn=(c=='-')?-1:1;
	ret=(c=='-')?0:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
	ret*=sgn;
	return 1;
}
template <class T>
inline void pt(T x) {
    if (x <0) {
        putchar('-');
        x = -x;
    }
    if(x>9) pt(x/10);
    putchar(x%10+'0');
}
int MON[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,\
                31,29,31,30,31,30,31,31,30,31,30,31
};
int YEAR[3000];//year[i]表示 到第i年结束时的小时数
bool run(int x){if(x%400 == 0)return true; return (x%100) && x%4==0;}
void init(){
    memset(YEAR, 0, sizeof YEAR);
    for(int i = 2000; i < 3000; i++)
    {
        YEAR[i] = YEAR[i-1];
        YEAR[i] += 8760;
        if(run(i)) YEAR[i] += 24;
    }
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 12; j++)
            MON[i][j] *= 24;
}
int find_yue(string str){
    if(str=="Jan")return 1;
    if(str=="Feb")return 2;
    if(str=="Mar")return 3;
    if(str=="Apr")return 4;
    if(str=="May")return 5;
    if(str=="Jun")return 6;
    if(str=="Jul")return 7;
    if(str=="Aug")return 8;
    if(str=="Sep")return 9;
    if(str=="Oct")return 10;
    if(str=="Nov")return 11;
    if(str=="Dec")return 12;
    return -100000000;
}


const int N = 50010;
int n, m, s, t, cost[100010];
struct Buy{
    int tim, r;
}buy[2555];
void input(){
    string mon;
    for(int i = 1, day, year, hour; i <= n; i++)
    {
        cin>>mon; rd(day); rd(year); rd(hour); rd(buy[i].r);
        buy[i].tim = YEAR[year-1];
        int cur = run(year);
        int yue = find_yue(mon) -1;
        for(int j = 0; j < yue; j++)
            buy[i].tim += MON[cur][j];
        buy[i].tim += 24*(day-1);
        buy[i].tim += hour;
    }
    rd(t); rd(s);
    for(int i = 0; i < m; i++)rd(cost[i]);
 //   for(int i = 1; i <= n; i++)printf("(%d,%d)\n", buy[i].tim, buy[i].r);
}
struct node {
    int id;
    ll v;
    node() {}
    node(int _id, ll _v) {
        id = _id; v = _v;
    }
    friend bool operator < (const node& j, const node& i) {
        if (i.v!=j.v)
            return i.v<j.v;
        else
            return i.id<j.id;
    }
};
priority_queue<node>Q;
void work() {
    ll ans = 0, x = 0;
    while (!Q.empty()) Q.pop();
    int idx = 1;
    for (int i = 0; i < m; ++i) {
        Q.push(node(i, cost[i]-x));
        while (!Q.empty() && i-Q.top().id>t)
            Q.pop();
        while (idx<=n&&buy[idx].tim==i) {
            ans += (ll)buy[idx].r * (cost[Q.top().id] + (ll)(i-Q.top().id)*s);
            //ans += (ll)buy[idx].r * (Q.top().v+x);
            ++idx;
        }
        if (idx == n+1)
            break;
        x += s;
    }
    while (idx<=n) {
        while (!Q.empty() && buy[idx].tim-Q.top().id>t)
            Q.pop();
        ans += (ll)buy[idx].r * (cost[Q.top().id] + (ll)(buy[idx].tim-Q.top().id)*s);
        ++idx;
    }
    pt(ans);
    putchar('\n');
}
int main() {
    init();
	while(cin>>n>>m, n+m) {
        input();
        work();
	}
	return 0;
}
/*
1 4
Jan 1 2000 7 10
3 10
1
20
200
10



*/


你可能感兴趣的:(HDU 4122 Alice's mooncake shop 优先队列)