这道题思路很强,题面比较坑
旧厂必须只被供给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;
}