[BZOJ2426][HAOI2010] 工厂选址 (神奇的贪心)

来源:互联网 发布:vbscript和vb 编辑:程序博客网 时间:2024/06/05 07:49

这道题思路很强,题面比较坑

旧厂必须只被供给b吨煤(不能多也不能少),其余煤必须都给新厂。

枚举所有新厂,把所有的煤都给新厂,再求出所有煤矿的(旧厂运费-新厂运费)值,从小到大排序,按顺序把旧厂该得的煤拿回来。这个思路很强。 


#include<bits/stdc++.h>#define rep(i,j,k) for(int i=(int)j; i<=(int)k; ++i)using namespace std;const int N=55, M=50010, INF=1000000000;int m, b, n, vi, ans, id;int h[N], C[N][M], a[M];struct K{int cha,bel;bool operator < (const K & rhs)const { return cha<rhs.cha; }}sub[M];inline void getint(int &x){x=0; char c=getchar();while(!(c>='0'&&c<='9')) c=getchar();while(c>='0'&&c<='9') x=x*10+c-'0', c=getchar();}int main(){scanf("%d%d%d%d",&m,&b,&h[0],&n);rep(i,1,m) getint(a[i]);rep(i,1,n) getint(h[i]);rep(i,0,n) rep(j,1,m) getint(C[i][j]);int cost, tmp, q; ans=INF;rep(i,1,n){cost = h[0]+h[i]; tmp = b;rep(j,1,m){ cost+=a[j]*C[i][j]; sub[j]=(K){C[0][j]-C[i][j],j}; }// 把煤都给新厂  sort(sub+1,sub+m+1);rep(j,1,m){// 把煤还给旧厂  q = sub[j].bel;if(tmp>a[q]){ cost+=a[q]*sub[j].cha; tmp-=a[q]; } else{ cost+=tmp*sub[j].cha; break; }}if(cost<ans){ ans=cost; id=i; }}printf("%d\n%d\n",id,ans);while(1);return 0;}

原创粉丝点击