题目描述

某地区有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[50005][55], cost[55], a[50005];
 struct Fact{
     int pos, val;
 }w[50005];
 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 = 1; i <= m; ++ i)    scanf("%d", &a[i]);
     for(int i = 1; i <= n; ++ i)    scanf("%d", &cost[i]);
     for(int i = 1; i <= m; ++ i)    scanf("%d", &c[i][0]);
     for(int i = 1; i <= n; ++ i)
         for(int j = 1; j <= m; ++ j)
             scanf("%d", &c[j][i]);
     for(int i = 1; i <= n; ++ i)
         {
             tag = 0, ans = 0;
             for(int j = 1; j <= m; ++ j)
                 {
                     w[j].val = c[j][i] - c[j][0];
                     w[j].pos = j;
                 }
             sort(w + 1, w + 1 + m, comp);
             int k = 0;
             for(;;)
                 {
                     ++ k;
                     if(tag + a[w[k].pos] > b)
                         {
                             ans += c[w[k].pos][0] * (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][0] * 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 0;
 }

转载于:https://www.cnblogs.com/2020pengxiyue/p/9459988.html

【HAOI2010】工厂选址题解相关推荐

  1. bzoj2426 [HAOI2010]工厂选址 读题+贪心

    这个提题目描述比较模糊,读错了两遍题 首先旧工厂必须正好是b吨 然后c是每吨的价钱 然后就顺着特殊条件就很好做了 工厂地址之间互不影响,直接枚举 首先有一个工厂是固定的,而且每一吨煤不是旧就是新 所以 ...

  2. 补充3 需求分配和工厂选址模型(工厂和仓库同时选址)——基于java和cplex的实现

    这一部分是第二部分的供应链网络的设计(二)供应链的网络设计第六部分在区域内识别潜在地点的模型. 目录 一.所需输入 二.将需求分配给现有生产设施的需求分配模型 三.生产设施选址模型 四.更复杂的.有能 ...

  3. 补充1 设计区域网络配置的优化模型(工厂选址模型)——基于java和cplex的实现

    这一部分是第二部分的供应链网络的设计(二)供应链的网络设计第四部分设计区域网络配置的优化模型. 目录 一.所需输入 二.有能力约束的工厂选址模型 1.利用excel进行规划求解 2.利用java和cp ...

  4. 遗传算法在离散型工厂选址问题中的应用

    一.背景介绍 最近论坛上有一些同学私信要遗传算法的代码,这两天整理了一下,希望对大家有帮助. 1.1 工厂选址问题(转自去年写的退火算法) 工厂选址问题是运筹学中的经典问题之一,它描述的是在综合考虑工 ...

  5. codevs 1507 酒厂选址 题解报告

    噫 题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒.以前这种啤酒都是从波兰进口,但今年居民们想建一个自己的啤酒厂.岛上所有的城市都坐落在海边,并且由一条沿海 ...

  6. P2514-[HAOI2010]工厂选址【贪心】

    正题 题目链接:https://www.luogu.org/problemnew/show/P2514 题目大意 有一个厂,需要bbb吨煤炭,然后第jjj个矿运到该厂的运费为c0,jc_{0,j}c0 ...

  7. 和某ZYC巨佬和XXY巨佬的随机挑战2总结

    前言 一切的起点在那个炎热的酷暑,菜的一批的WYCWYCWYC坐在最容易被∗*∗的左下角.这时他永远都想不到,他与巨佬之间的挑战,即将开始. 正题 规则 随机跳333到蓝题,然后写完. 完成记录 题目 ...

  8. seir模型启发式算法_好文荐读|选址问题的启发式方法

    今日荐读 设施选址问题(facility location problem,FLP)是运筹学领域中的一类经典问题.这一问题是在满足顾客对商品的需求前提下,为一些设施选定建造地点,使得总费用尽可能少.这 ...

  9. 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?

    日前,据路透社报道,全球顶级零部件供应商博世正在位于德国东部的德累斯顿市兴建半导体工厂,总投资预计达10亿欧元(约合11亿美元).据悉,此举凸显了博世对自动驾驶汽车以及工业物联网方向的双重布局. 据雷 ...

最新文章

  1. WebMagic功能——XPath、CSS选择器、正则表达式 || 抽取元素API、获取结果API || ​​​​​​​获取链接||​​​​​​​使用Pipeline保存结果
  2. 模式识别与智能系统和计算机视觉,天津大学模式识别与智能系统
  3. 档案和社会保险究竟有什么关系?【转】
  4. Linux做软raid10,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  5. filegetcontents php 返回值,php – file_get_contents没有返回任何数据
  6. linux终端贪吃蛇,分享|nSnake: 在Linux的终端上玩经典的贪食蛇游戏
  7. 位数问题(信息学奥赛一本通-T1313)
  8. Java基础学习总结(81)——如何尽可能的减少Java代码中bug
  9. 【8-22】java学习笔记04
  10. mysql导入错误_mysql导入sql文件出错的一种解决方法
  11. C语言-基础例题55道
  12. scratch课程案例——时钟
  13. 计算机屏幕方向变化,知识:如何切换笔记本电脑屏幕的方向_计算机的基本知识_IT /计算机_信息...
  14. matlab 电路频率响应_电力电子模型频率响应估计
  15. hp服务器系统降级,HP 服务器firmware 升级方法.pdf
  16. 算法注册机编写扫盲之续篇---第三课
  17. 光照度传感器之RS485 通信与 Modbus 协议
  18. AutoJs学习-2048小游戏自动化
  19. 第十周 项目一(4)哈夫曼编码的算法验证
  20. ![CDATA[]]和转义字符

热门文章

  1. java中自定义异常的_java中的自定义异常(标准)
  2. python中求包含5的数_Python 内置函数 ( ) 可以返回列表、元组、字典、集合、字符串以及 range 对象中元素个数。_学小易找答案...
  3. c语言指针改良,重新认识C语言指针(上)(示例代码)
  4. Koa框架——coderhub实战
  5. LeetCode 2182. 构造限制重复的字符串(贪心、map)
  6. LeetCode 267. 回文排列 II(回溯)
  7. LeetCode 77. 组合(回溯)
  8. python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网
  9. python中的可迭代对象
  10. PL/SQL程序设计以及安全管理实验遇到的问题及解决