首页 > 其他分享 >P2514 [HAOI2010] 工厂选址 题解

P2514 [HAOI2010] 工厂选址 题解

时间:2023-10-28 19:55:19浏览次数:36  
标签:费用 limits int 题解 sum 煤矿 发电厂 HAOI2010 P2514

目录

Description

有 \(m\) 座煤矿,每一座煤矿有 \(a_i\) 吨煤,第 \(i\) 座煤矿到第 \(j\) 号发电厂的运费为 \(c_{i,j}\) 每吨。

有一座发电厂(标号为 0),需要恰好 \(b\) 吨煤矿发电,初始运行费用为 \(h\)。还有 \(n\) 座待运行的发电厂(标号为 1~n),每座发电厂初始运行费用为 \(h_i\),你需要选择其中一座让它运行起来。

将所有煤分给这两座发电厂,问最小费用是多少。

Solution

这道题的题目描述就是第一个坑,注意以下几点:

  • 0 号发电站一定要运行,原题面可能有些表述模糊。
  • 对于新的发电站,它分配到的煤为 \(tot-b\)(其中 \(tot=\sum \limits_{i=1}^m a_i\))吨,而不是 \(b\) 吨。

发现 \(1\le m\le5\times10^4,1\le n\le50\),所以遍历 \(n\) 座发电厂,每次遍历所有煤矿,比较选当前的发电厂时的费用是可以过的。

假设当前遍历到 \(i\) 号发电厂,若所有煤都在这个发电厂,费用为 \(\sum\limits_{j=1}^m a_{j}\times c_{j,i}\) 。

因为 0 号发电厂要选 \(b\) 吨,所以费用为 \(\sum\limits_{j=1}^m a_{j}\times c_{j,i}-\sum\limits_{k=1}^t a_k\times(c_{k,i}-c_{k,0})\)(后面的都是转到 0 号去了)。为了最小化费用,所以要让 \(c_{k,i}-c_{k,0}\) 尽量大,按这个值对每一座煤矿进行排序。然后遍历煤矿,如果还加的进 0 号(可能整座煤矿加不进,只加的进一部分,需要判断每次加入前 0 号的剩余空间)就加,加不进就加到 \(i\) 号。

然后比较每一座发电站的费用大小即可。

Code

#include<bits/stdc++.h>
using namespace std;
int m,b,h,n;
int a[50050],w[60],c[60][50050];
struct node{
	int no,val;
}d[50050];
bool cmp(node x,node y){
	return x.val>y.val;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>m>>b>>h>>n;
	for(int i=1;i<=m;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	for(int i=0;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c[i][j];
		}
	}
	int minn=1000000000,ans=0;
	for(int i=1;i<=n;i++){
		int tot=0,sum=h+w[i];  //运行费用别忘了
		for(int j=1;j<=m;j++){
			d[j].no=j;
			d[j].val=c[i][j]-c[0][j];
		}
		sort(d+1,d+1+m,cmp);
		int j=1;
		for(j;j<=m;j++){
			if(b-tot<=a[d[j].no]){  //放不进整座
				sum+=(b-tot)*c[0][d[j].no];
				sum+=(a[d[j].no]-b+tot)*c[i][d[j].no];
				break;
			}
			sum+=a[d[j].no]*c[0][d[j].no];
			tot+=a[d[j].no];  //更新剩余空间
		}
		j++;
		for(j;j<=m;j++){
			sum+=a[d[j].no]*c[i][d[j].no];
		}
		if(sum<minn){
			minn=sum;
			ans=i;
		}
	}
	cout<<ans<<endl<<minn<<endl;
	return 0;
}

标签:费用,limits,int,题解,sum,煤矿,发电厂,HAOI2010,P2514
From: https://www.cnblogs.com/larryyu/p/17794527.html

相关文章

  • ctf_show Web的Web8题解
    好久没写博客,上次写还是在上次(三年前)。如题,写一次CTF的题解 根据题目提示得知这应该是一个注入,什么注入还不知道,进入靶场。 仅有三个地方可点,都点进去看看。从URL处可以看到前端是传了一个参数id给后端(另外两个类似,就不贴图了)。那很明显了是SQL注入。 首先在参数后......
  • 【深度学习 | 概念】那些深度学习路上必经的 常见问题解决方案及最佳实践,确定不来看看
    ......
  • CSP-J 2023 题解
    CSP-J2023题解T1小苹果这个题直接遍历枚举必定TLE,这是CCF的出题风格,每题T1巨水无比,但是往往又需要一些思维。这道题我们可以发现每一轮操作都会拿走\(1+(n-1)/3\)个苹果,所以每次让\(n\)减去\(1+(n-1)/3\)就可以了。然后记录编号为\(n\)什么时候拿......
  • 「联合省选 2020 A」组合数问题 题解
    非常显然的,我们展开\(f(k)\),于是有:\[\begin{align}&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}k^{i}x^{k}\binom{n}{k}\\=&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}{\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}\binom{......
  • CF777E题解
    分析看到这个题就想到了二维偏序。你们很自然地,以\(b\)为第一关键字降序排序,当有若干个片\(b\)相等时,我们发现由于\(a<b\),所以排到最后的片一定能把这些\(b\)相等的片都统计上,而前面的片能否统计是依赖于\(b\),所以考虑如何让后面的片更好统计,显然\(a\)越小越好统......
  • NOIP2023模拟5联测26 题解
    NOIP2023模拟5联测26题解感觉我这场的官方题解写的是真的挺好的,所以我只能作少量补充。你可以直接去看官方题解,如果你想的话。T1x题解\(n=2\)没啥可说的。\(\color{white}{这档分你要是没拿到那你还是蛮强的。}\)\(n=3\)的时候,我们需要比较\((a_1^{a_2})^{a_3}\)与......
  • [TopCoder 13001] BigO 题解
    [TopCoder13001]BigO题解题目描述给定一张有向图,当\(L\)趋近于无穷大时,长度为\(L\)的路径条数有\(S\)条,此时若\(S=O(L^k)\),输出\(k\),否则如果没有多项式的大O表示法,输出\(-1\)。指数情况首先如果一张图中存在如下强连通分量,则\(S=O(2^L)\)。因为每次到1......
  • P7650 题解
    非常好题目,第一步都想不出来。可以观察出来最优方案必定是从大往小将\(x\)放到\(x+1\)前,有可能不动,中间的比他小的一定要放到前面去。考虑用dp计算最小值。这里是这道题最重要的一步:相对位置的变化非常不好描述,考虑将所有数固定。一次操作改为:不影响其他其他数的位置,将一......
  • 题解 P4285 [SHOI2008] 汉诺塔
    具体思路设\(f_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发的步数。设\(g_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发到哪个柱子。记\(y=g_{i-1,x}\),\(z=6-x-y\)。其中,\(y\)代表将前\(i-1\)个盘子从\(x\)柱子移到的柱子,\(z\)代表剩下的那个柱子。分类讨论。若......
  • P2230 Tinux系统 题解
    传送门提供一种基于贪心的解法。首先是将\(p\)从小到大排序考虑到该系统是一棵树,所以对于系统中的每个点,我们记:\(tr_{son}\)表示该点(目录)的儿子的位置\(tr_{fa}\)表示该点(目录)的父亲的位置\(tr_{siz}\)表示该点(目录)包含的点的个数\(tr_{cnt}\)表示该点(目录)有......