HDU 4122 Alice's mooncake shop (单调队列/线段树)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4122

 

题意:好难读懂,读懂了也好难描述,亲们就自己凑合看看题意把

题解:开始计算每个日期到2000/1/1日0点有多少个小时,然后求出每个小时的时候每个的最小单价(包括成本+储存费用)

使用单调队列,维护队列,使之到i 生产的最优

 

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s)  scanf("%s",s)
#define pi1(a)    printf("%d\n",a)
#define pi2(a,b)  printf("%d %d\n",a,b)
#define mset(a,b)   memset(a,b,sizeof(a))
#define forb(i,a,b)   for(int i=a;i<b;i++)
#define ford(i,a,b)   for(int i=a;i<=b;i++)

typedef __int64 LL;
const int N=110001;
const int M=1000007;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7;

LL n,m,s,t;
char ss[100];
int mm[13],yy[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
map<string,int> mp;
struct node
{
    int t,num;
}q[3333*4],order[3333];

bool isrun(int y)
{
    if(y%400==0||(y%4==0&&y%100!=0))
        return true;
    return false;
}

int run(int y1,int y2)
{
    int num=0;
    for(int i=y1;i<y2;i++)
        if(i%400==0||(i%4==0&&i%100!=0))
            num++;
    return num;
}

int main()
{
    mm[0]=0;
    for(int i=1;i<=12;i++)
        mm[i]=mm[i-1]+yy[i];
    mp["Jan"]=1;
    mp["Feb"]=2;
    mp["Mar"]=3;
    mp["Apr"]=4;
    mp["May"]=5;
    mp["Jun"]=6;
    mp["Jul"]=7;
    mp["Aug"]=8;
    mp["Sep"]=9;
    mp["Oct"]=10;
    mp["Nov"]=11;
    mp["Dec"]=12;

    while(scanf("%I64d%I64d",&n,&m)&&(n+m))
    {
        for(int i=0;i<n;i++)
        {
            string ss;
            int ri,nian,shi,ge;
            cin>>ss;
            scanf("%d%d%d%d",&ri,&nian,&shi,&order[i].num);
            int yue=mp[ss];
            int sum=(nian-2000)*365+run(2000,nian);
            sum+=mm[yue-1]+ri-1;
            if(yue>2&&isrun(nian))   sum++;
            order[i].t=sum*24+shi;
        }
        int top=0,tail=0,p=0,t,s;
        LL sum=0;
        scanf("%d%d",&t,&s);
        for(int i=0;i<m;++i)
        {
            int a;
            scanf("%d",&a);
            while(top<tail && q[tail-1].num+(i-q[tail-1].t)*s>=a)--tail;
            q[tail].num=a,q[tail++].t=i;
            while(p<n && i == order[p].t)
            {
                while(q[top].t+t<i)++top;
                sum+=(q[top].num+(i-q[top].t)*s)*order[p++].num;
            }
        }
        printf("%I64d\n",sum);
    }
    return 0;
}
/*
1 10
Jan 1 2000 9 10
5 2
20
20
20
10
10
8
7
9
5
10
0 0
*/


 

 

posted on 2013-09-25 20:31  新一  阅读(150)  评论(0编辑  收藏  举报

导航