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

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

 

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

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

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

 

AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 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>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=a)--tail;
            q[tail].num=a,q[tail++].t=i;
            while(p


 

你可能感兴趣的:(单调队列)