【HAOI2010】工厂选址题解
题目描述
某地区有m座煤矿,其中第i号矿每年产量为ai吨,现有火力发电厂一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运费为Ci0(i=1,2,…,m)。
现规划新建一个发电厂,m座煤矿每年开采的原煤将全部供给这两座发电厂。现有n个备选的厂址。若在第j号备选厂址建新厂,每年运行的固定费用为hj元。每吨原煤从第i号矿运到j号备选厂址的运费为Cij(i=1,2,…,m;j=1,2,…,n)。
试问:应把新厂厂址选取在何处?m座煤矿开采的原煤应如何分配给两个发电厂,才能使每年的总费用(发电厂运行费用与原煤运费之和)为最小。
输入输出格式
输入格式:
第1行: m b h n
第2行: a1 a2 … am (0<=ai<=500, a1+a2+...+an>=b)
第3行: h1 h2 … hn (0<=hi<=100)
第4行: C10 C20 … Cm0 (0<=Cij<=50)
第5行: C11 C21 … Cm1
… …
第n+4行:C1n C2n … Cmn
输出格式:
第1行:新厂址编号,如果有多个编号满足要求,输出最小的。
第2行:总费用
说明
对于所有数据, n<=50, m<=50000, b<=10000
题解
我们看到这道题的数据,发现工厂的数量不会多余50个,所以我们可以考虑枚举新的工厂的选址。
然后,问题就转化为了两个工厂如何分配资源使得总花费最小,我们可以利用贪心的思想来做:
如果所有的资源都汇集到新建的厂(now),那么花费就为∑(a[i]*c[i][now]),然后我们要从所有的资源中提取出b的资源使得这个值最小,所以我们可以记录w[i] = c[i][now] - c[i][0]表示把i的资源移到原工厂每吨会多花多少钱。然后我们在以此排序贪心即可。
这种贪心的思想是利用的一种差值,这个差值的实际含义为:在把所有的关键量都放在一个组中达到一个定值,然后在从中移取出一部分,而达到的新的量就是新的花费减去不用的花费在这种情况下我们就可以使用差值来贪心。
程序
#include<bits/stdc++.h>
using namespace std; int b, m, n, h;
int c[][], cost[], a[];
struct Fact{
int pos, val;
}w[]; inline bool comp(const Fact & x, const Fact & y) {return x.val > y.val;} int main()
{
int sumcost = 0x7fffffff, num, tag, ans;
scanf("%d%d%d%d", &m, &b, &h, &n);
for(int i = ; i <= m; ++ i) scanf("%d", &a[i]);
for(int i = ; i <= n; ++ i) scanf("%d", &cost[i]);
for(int i = ; i <= m; ++ i) scanf("%d", &c[i][]);
for(int i = ; i <= n; ++ i)
for(int j = ; j <= m; ++ j)
scanf("%d", &c[j][i]);
for(int i = ; i <= n; ++ i)
{
tag = , ans = ;
for(int j = ; j <= m; ++ j)
{
w[j].val = c[j][i] - c[j][];
w[j].pos = j;
}
sort(w + , w + + m, comp);
int k = ;
for(;;)
{
++ k;
if(tag + a[w[k].pos] > b)
{
ans += c[w[k].pos][] * (b - tag);
ans += c[w[k].pos][i] * (a[w[k].pos] - (b - tag));
break;
}
tag += a[w[k].pos];
ans += c[w[k].pos][] * a[w[k].pos];
}
for(;k <= m;) ++ k, ans += c[w[k].pos][i] * a[w[k].pos];
ans += h + cost[i];
if(sumcost > ans)
{
sumcost = ans;
num = i;
}
}
printf("%d\n%d\n", num, sumcost);
return ;
}
【HAOI2010】工厂选址题解的更多相关文章
- 【BZOJ2426】[HAOI2010]工厂选址(贪心)
[BZOJ2426][HAOI2010]工厂选址(贪心) 题面 BZOJ 洛谷 题解 首先看懂题目到底在做什么. 然而发现我们显然可以对于每个备选位置跑一遍费用流,然后并不够优秀. 不难发现所有的位置 ...
- BZOJ 2426: [HAOI2010]工厂选址
2426: [HAOI2010]工厂选址 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 364 Solved: 248[Submit][Status ...
- 2426: [HAOI2010]工厂选址
2426: [HAOI2010]工厂选址 链接 代码: /* 贪心: 奇妙!!!!! 因为所有的煤矿不是给新厂,就是给旧厂(而且旧厂的得到b) 为了使费用最小,感性的理解,那么一个煤矿给哪个厂,取决于 ...
- BZOJ2426 [HAOI2010]工厂选址
Description 某地区有m座煤矿,其中第i号矿每年产量为ai吨,现有火力发电厂一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运 ...
- HAOI2010 工厂选址
题目链接:戳我 数组开小火葬场qwqwq 就是一个贪心吧.对于一个数,我们知道只有两种摆放方式.所以我们可以先都放到新的里面,然后做一下新的-原先的差,按照差从大到小排序,依次提取数值减去即可. 代码 ...
- 洛谷P2514||bzoj2426 [HAOI2010]工厂选址
洛谷P2514 bzoj2426 其实是个简单的贪心,然而不适合在脑子不清醒的时候做...看不懂题意续了1个小时 很容易发现应该枚举新建哪个发电厂,对于这种方案就是取其中b吨煤运到原来发电厂,取剩下( ...
- 【文文殿下】[CEOI2004]锯木厂选址 题解
题解 我们枚举建厂的位置,发现有个\(n^2\)的DP.随手搞个斜率优化到\(O(n)\). #include<bits/stdc++.h> using namespace std; ty ...
- BZOJ2427:[HAOI2010]软件安装——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2427 https://www.luogu.org/problemnew/show/P2515 现在 ...
- 【P2514】工厂选址(贪心)
看到题了不首先应该看看数据范围确定一下算法么,这个题的数据范围大约可以支持到O(nmlogm),所以肯定不是搜索什么的,DP貌似至少也要n^2m,所以可以想一些其他的.对于题目的输入,我们发现这些输入 ...
随机推荐
- java--线程状态【转】
1.新建状态 Thread t1 = new Thread(); 创建之后,就已经有了相应的内存和其他资源,但是还是处于不可运行状态. 2.就绪状态 当一个线程使用.start()启动之后就处于就绪状 ...
- [H5表单]一些html5表单知识及EventUtil对象完善
紧接着上面的文章,一开始准备一篇文章搞定,后来看到,要总结的东西还不少,干脆,把上面文章拆成两部分吧,这部分主要讲讲表单知识! 表单知识 1.Html5的autofocus属性. 有个这个属性,我们不 ...
- Centos 从零开始 (二)
因为我是搞 nodejs的 所以以后会安装一些依赖于node的 比如mongodb数据库等. 6:安装nodejs 安装的时候遇到个小问题.yum install nodejs 报错 说没有这个包.然 ...
- meteor框架学习
meteor js的全栈开发框架,官方的解释: Meteor makes it an order of magnitude simpler, and a lot more fun. You can b ...
- [javaEE] tomcat内部连接池
在META-INF的目录下,新建context.xml 在程序中获取数据源,通过jndi,这个jndi必须在Servlet中才能获取,并且需要配置web.xml使servlet一启动就拿到数据源 co ...
- Hibernate学习2--对象的三种状态以及映射关系的简单配置
上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...
- java通过超链接和servlet配置实现服务器文件下载
1.在页面上面我们可以简单的写成: <td align="center""> <a href="<c:url value="/ ...
- 用一个小例子来谈谈javascript的运行机制
先上例子! <script type="text/javascript"> console.log('博'); setTimeout(function(){ conso ...
- 禁用F12和鼠标右键,防止查看控制台代码
虽然是个治标不治本的办法,还是挺有用的(对Opera无效,Opera开始控制台是Ctrl+Shift+C) 在禁用同时,自身的代码健壮性也需要加强 // 屏蔽F12 document.onkeydow ...
- 新手必需用!大道至简的前端编辑器Sublime Text
很多人在进入学习前端的时候(包括我自己),除了选择学习合适的技术,还需要一个得(自)心(己)应(喜)手(欢)的开发工具,一个得心应手的开发工具除了可以令你的效率大大提高,也可以令你在写代码的时候,心情 ...