记录编号 330716 评测结果 AAAAAAAAAA
题目名称 [HAOI 2010]工厂选址 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.107 s
提交时间 2016-10-26 20:02:16 内存使用 12.50 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=60,M=50010;
int m,b,H,n,p,a[M],h[M],c[M][N];
inline int read(){
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
ll ans;int d[M],P[M];
bool cmp(const int x,const int y){
	return d[x]<d[y];
}
ll solve(int x){//我们假定全部的煤运到x,剩下的贪心 
	ll ans=h[x];
	for (int i=1;i<=m;i++){
		ans+=a[i]*c[i][x];
		d[i]=c[i][0]-c[i][x];
		P[i]=i;
	}
	sort(P+1,P+m+1,cmp);
	int now=b;
	for (int i=1;i<=m;i++)
	if (now>0){
		int j=P[i];
		if (now>=a[j]) ans+=a[j]*d[j],now-=a[j];
			else ans+=now*d[j],now=0;
	}
	return ans;
}
int main()
{
	freopen("factory1.in","r",stdin);
	freopen("factory1.out","w",stdout);
	m=read();b=read();H=read();n=read();
	for (int i=1;i<=m;i++) a[i]=read();
	for (int i=1;i<=n;i++) h[i]=read();
	for (int i=0;i<=n;i++)
	for (int j=1;j<=m;j++) c[j][i]=read();
	ll ans=1e16;
	for (int i=1;i<=n;i++){
		ll j=solve(i);
		if (ans>j) ans=j,p=i;
	}
	printf("%d\n%lld\n",p,ans+H);
	return 0;
}