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

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

旧厂必须只被供给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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值