码迷,mamicode.com
首页 > 其他好文 > 详细

2019-11-03 [开心的金明]

时间:2019-11-04 11:24:22      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:min   name   clu   标准   alt   code   一个   ret   制造   

$Description$:

1.原材料的价格为 ci 元/个,原材料的数量无限制。
2.顾客的需求量为 di 台电脑,也就是说这个月你至少要有 di 个电脑。
3.这个月你的公司可以生产 pi 台电脑,生产一个电脑消耗一个原材料和 mi
元的费用。
4.你可以把这个月剩下的电脑以及原材料放在仓库里给下一个月(如果下一
个月也不用,就按照下一个月标准计算开销),但是原材料和电脑的储存方式是
不同的。对于原材料,没有数量的限制,但是电脑在这个月最多只能储存 ei 台,
储存一个原材料消耗 Ri 元,储存一台电脑消耗 Ei 元
5.只要这个月生产能力足够,你可以用这个月购买的原材料直接去生产电脑,
同样,你也可以在同一个月制造和销售电脑,这些原材料的电脑不占用仓库。最
初,小木的公司没有任何原材料的电脑。

$Solution$:

刚开学,很困,考场上看到这么多限制的题目直接弃了,状态急需调整。

一步步摸清思路:

首先,原材料的限制要少一些,可以得出当前的最有原材料价格是$\min(c[i]+\sum R[j])$

然后考虑怎么处理在之前提前造出电脑留给后面某个时刻这种情况,可以把这塞到$set$里,但并不代表要买,只是预备,如果要用才在$ans$里加进去。

维护$set$,每次将新的种类电脑塞进去,取$begin$更新答案,最后删除$end$满足$e[i]$。

 

技术图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<set>
 4 #define LL long long
 5 #define MAXN 51000
 6 using namespace std;
 7 inline int read(){
 8     int s=0,w=0;char ch=getchar();
 9     while(ch<0||ch>9)w|=(ch==-),ch=getchar();
10     while(ch>=0&&ch<=9)s=s*10+ch-0,ch=getchar();
11     return w?-s:s;
12 }
13 #define kd (read())
14 int k;
15 int c[MAXN],d[MAXN],m[MAXN],p[MAXN];
16 int e[MAXN],R[MAXN],E[MAXN];
17 struct node{
18     int id,cnt;
19     LL cost;
20     friend bool operator <(const node &a,const node &b){
21         if(a.cost==b.cost){
22             if(a.id==b.id)return a.cnt<b.cnt;
23             return a.id<b.id;
24         }
25         return a.cost<b.cost;
26     }
27 };
28 set<node >wg;
29 LL ans=0;
30 LL sumE[MAXN];
31 int main(){
32     freopen("happy.in","r",stdin);
33     freopen("happy.out","w",stdout);
34     k=kd;
35     for(int i=1;i<=k;++i)c[i]=kd,d[i]=kd,m[i]=kd,p[i]=kd;
36     for(int i=1;i<k;++i)e[i]=kd,R[i]=kd,E[i]=kd;
37     int mnc=(1<<30);
38     int dcnt=0;
39     set<node >::iterator it;
40     for(int i=1;i<=k;++i){
41         mnc=min(mnc,c[i]);
42         node tt;
43         tt.id=i;tt.cnt=p[i];tt.cost=mnc+m[i]-sumE[i-1];
44         wg.insert(tt);dcnt+=p[i];
45         if(dcnt<d[i]){
46             puts("-1");
47             return 0;
48         }
49         while(d[i]){
50             it=wg.begin();
51             tt=*it;
52             wg.erase(tt);
53             LL w=tt.cost+sumE[tt.id-1]+sumE[i-1]-sumE[tt.id-1];
54             if(d[i]<tt.cnt){
55                 tt.cnt-=d[i];
56                 dcnt-=d[i];
57                 ans+=w*d[i];
58                 d[i]=0;
59                 wg.insert(tt);
60             }
61             else{
62                 d[i]-=tt.cnt;
63                 dcnt-=tt.cnt;
64                 ans+=tt.cnt*w;
65             }
66         }
67         while(i!=k&&dcnt>e[i]){
68             it=wg.end();
69             tt=*--it;
70             wg.erase(tt);
71             if(dcnt-tt.cnt<e[i]){
72                 int delta=dcnt-e[i];
73                 tt.cnt-=delta;
74                 dcnt=e[i];
75                 wg.insert(tt);
76             }
77             else dcnt-=tt.cnt;
78         }
79         mnc+=R[i];
80         sumE[i]=sumE[i-1]+E[i];
81     }
82     printf("%lld\n",ans);
83     return 0;
84 }
View Code

 

 

 

2019-11-03 [开心的金明]

标签:min   name   clu   标准   alt   code   一个   ret   制造   

原文地址:https://www.cnblogs.com/2018hzoicyf/p/11790773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!