标签: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 }
标签:min name clu 标准 alt code 一个 ret 制造
原文地址:https://www.cnblogs.com/2018hzoicyf/p/11790773.html