hdu 4122 Alice's mooncake shop (线段树)

题目大意:

一个月饼店每个小时做出月饼的花费不一样。

储存起来要钱,最多存多久。问你把所有订单做完的最少花费。

思路分析:

ans = segma( num[]*(cost[] + (i-j)*s) )

整理一下会发现式子就是

cost[]-j*s + i*s

对于每一个订单,我们把i拿出来分析

所以也就用cost - j*s 建树。

然后在储存期间找到最小的花费就行了。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
#define maxn 2555
#define maxm 100005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;

int n,m;
int days[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                {0,31,29,31,30,31,30,31,31,30,31,30,31}};
string tab[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
LL tre[maxm<<2];

int getmonth(string x)
{
    for(int i=1;i<=12;i++)
    if(x==tab[i])return i;
}
bool leap(int x)
{
    if(((x%4==0) && x%100!=0) || x%400==0)return true;
    return false;
}
LL gethour(int month,int day,int year,int hour)
{
    LL res=day-1;
    int is=leap(year);
    for(int i=1;i<month;i++)res+=days[is][i];
    for(int i=2000;i<year;i++)
    res+=365+leap(i);
    res*=24;
    res+=hour+1;
    return res;
}
void build(int num,int s,int e)
{
    tre[num]=inf;
    if(s==e)return;
    int mid=(s+e)>>1;
    build(lson);
    build(rson);
}
void update(int num,int s,int e,int pos,LL val)
{
    if(s==e)
    {
        tre[num]=val;
        return;
    }
    int mid=(s+e)>>1;
    if(pos<=mid)update(lson,pos,val);
    else update(rson,pos,val);
    tre[num]=min(tre[num<<1],tre[num<<1|1]);
}
LL query(int num,int s,int e,int l,int r)
{
    if(l<=s && r>=e)
    {
        return tre[num];
    }
    int mid=(s+e)>>1;
    if(r<=mid)return query(lson,l,r);
    else if(l>mid)return query(rson,l,r);
    else return min(query(lson,l,mid),query(rson,mid+1,r));
}

string tmp;
LL num[maxn];
LL cost[maxm];
LL time[maxm];
int main()
{
    while(cin>>n>>m)
    {
        if(n==0 && m==0)break;
        for(int i=1;i<=n;i++)
        {
            int d,y,h,Num;
            cin>>tmp;
            cin>>d>>y>>h>>Num;
            num[i]=Num;
            time[i]=gethour(getmonth(tmp),d,y,h);
        }
        LL S,T;
        build(1,1,m);
        cin>>T>>S;
        for(int i=1;i<=m;i++)
        {
            cin>>cost[i];
            cost[i]-=i*S;
            update(1,1,m,i,cost[i]);
        }
        LL ans=0;
        for(int i=1;i<=n;i++)
        {
            if(time[i]>m)break;
            ans+=num[i]*(query(1,1,m,max(1LL,time[i]-T+1),time[i])+time[i]*S);
        }
        cout<<ans<<endl;
    }
    return 0;
}

hdu 4122 Alice's mooncake shop (线段树)

时间: 2024-08-08 18:59:06

hdu 4122 Alice's mooncake shop (线段树)的相关文章

hdu 4122 Alice&#39;s mooncake shop

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4122 题意大意是Alice开着一家月饼店,可以接到n做月饼的订单,而Alice只有在从2000年一月一日0点为第一个小时开始的前m个小时内做月饼,而且只能在整点 的时候做月饼,并且做月饼不花费时间,也就是一瞬间就可以做超级多的月饼,而每个月饼有t个小时的保质期,每个月饼保存每小时需要花费s元,而在可以 做月饼的m小时内,不同小时做月饼花费的钱也不同,每个订单都有交付订单嗯达时间,某年某月某日某时交付该

HDU 4122 Alice&#39;s mooncake shop 单调队列优化dp

Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4122 Description The Mid-Autumn Festival, also known as the Moon Festival or Zhongqiu Festival is a popular harvest festival celebrated by Ch

HDU 4122 Alice&#39;s mooncake shop --RMQ

题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从2000年1月1日0时开始计算,必须在每个订单的时间之前完成这么多月饼,月饼还有保质期T小时以及保存费用S每小时,现在问满足这n个点的最小成本是多少. 解法: 因为月饼有保质期T,所以第i个月饼只能在[Ti-T+1,Ti]时间内做好.如果时间j有订单,假设在时间i做月饼是最好的,那么这个订单每个月饼

【单调队列】HDU 4122 Alice&#39;s mooncake shop

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4122 题意:给定N和M,表示有N个订单,M个时刻可以做月饼,时刻以小时计算,任意时刻可以做若干个月饼.接着N行为N个订单的信息,包括时间和数量.再给定T和S,表示每个月饼的保质时间和每保存一小时的开销.然后M行为对应每个时刻制作月饼的代价.问说最少花费多少代价完成所有订单 思路:维护单调队列,把之前的花费大于当前的pop掉,把不满足保鲜期内的pop掉 代码:https://github.com/Mith

hdu 4122 Alice&#39;s mooncake shop(单调队列)

题目链接:hdu 4122 Alice's mooncake shop 题目大意:给定N和M,表示有N个订单,M个时刻可以做月饼,时刻以小时计算,任意时刻可以做若干个月饼.接着 N行为N个订单的信息,包括时间和数量.再给定T和S,表示每个月饼的保质时间和每保存一小时的开销.然后M行为 对应每个时刻制作月饼的代价.问说最少花费多少代价完成所有订单. 解题思路:单调队列或者RMQ,单调队列即用一个deque维护一个代价递增的队列,每次将头部保质期不够的剔除. RMQ可以将预处理处每个区间时刻代价的最

hdu 4122 Alice&amp;#39;s mooncake shop (线段树)

题目大意: 一个月饼店每一个小时做出月饼的花费不一样. 储存起来要钱.最多存多久.问你把全部订单做完的最少花费. 思路分析: ans = segma( num[]*(cost[] + (i-j)*s) ) 整理一下会发现式子就是 cost[]-j*s + i*s 对于每个订单,我们把i拿出来分析 所以也就用cost - j*s 建树. 然后在储存期间找到最小的花费即可了. #include <cstdio> #include <iostream> #include <algo

【HDOJ】4122 Alice&#39;s mooncake shop

RMQ的基础题目,简单题. 1 /* 4122 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque>

hdu 4268 Alice and Bob(multiset|线段树)

Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2901    Accepted Submission(s): 941 Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this

hdu4122 Alice&#39;s mooncake shop 单调队列

http://acm.hdu.edu.cn/showproblem.php?pid=4122 Alice's mooncake shop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2908    Accepted Submission(s): 744 Problem Description The Mid-Autumn Festi