【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的资源移到原工厂每吨会多花多少钱。然后我们在以此排序贪心即可。

  这种贪心的思想是利用的一种差值,这个差值的实际含义为:在把所有的关键量都放在一个组中达到一个定值,然后在从中移取出一部分,而达到的新的量就是新的花费减去不用的花费在这种情况下我们就可以使用差值来贪心。

程序

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int b, m, n, h;
 5 int c[50005][55], cost[55], a[50005];
 6 struct Fact{
 7     int pos, val;
 8 }w[50005];
 9
10 inline bool comp(const Fact & x, const Fact & y)    {return x.val > y.val;}
11
12 int main()
13 {
14     int sumcost = 0x7fffffff, num, tag, ans;
15     scanf("%d%d%d%d", &m, &b, &h, &n);
16     for(int i = 1; i <= m; ++ i)    scanf("%d", &a[i]);
17     for(int i = 1; i <= n; ++ i)    scanf("%d", &cost[i]);
18     for(int i = 1; i <= m; ++ i)    scanf("%d", &c[i][0]);
19     for(int i = 1; i <= n; ++ i)
20         for(int j = 1; j <= m; ++ j)
21             scanf("%d", &c[j][i]);
22     for(int i = 1; i <= n; ++ i)
23         {
24             tag = 0, ans = 0;
25             for(int j = 1; j <= m; ++ j)
26                 {
27                     w[j].val = c[j][i] - c[j][0];
28                     w[j].pos = j;
29                 }
30             sort(w + 1, w + 1 + m, comp);
31             int k = 0;
32             for(;;)
33                 {
34                     ++ k;
35                     if(tag + a[w[k].pos] > b)
36                         {
37                             ans += c[w[k].pos][0] * (b - tag);
38                             ans += c[w[k].pos][i] * (a[w[k].pos] - (b - tag));
39                             break;
40                         }
41                     tag += a[w[k].pos];
42                     ans += c[w[k].pos][0] * a[w[k].pos];
43                 }
44             for(;k <= m;)    ++ k, ans += c[w[k].pos][i] * a[w[k].pos];
45             ans += h + cost[i];
46             if(sumcost > ans)
47                 {
48                     sumcost = ans;
49                     num = i;
50                 }
51         }
52     printf("%d\n%d\n", num, sumcost);
53     return 0;
54 }

原文地址:https://www.cnblogs.com/2020pengxiyue/p/9459988.html

时间: 2024-10-31 18:29:42

【HAOI2010】工厂选址题解的相关文章

[haoi2010]工厂选址

某地区有m座矿,其中第i号矿每年产量为ai吨,现有火力发电站一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运费为Ci0(i=1,2,-,m:j=1,2,-,n).现规划新建一个发电厂,m座煤矿每年开采的原煤将全部供给这两座发电厂.现有n个备选的厂址.若在第j号备选厂址建新厂,每年运行的固定费用为hi元.每吨原煤从第i号矿运到j号备选厂址的运费为Cij(i=1,2,-,m:j=1,2,-,n).试问:应把新厂厂址选取在何处?m座煤矿

BZOJ2426 [HAOI2010]工厂选址

不想说什么了...一眼题,排个序贪心...样例过不了,怎么可能?!乱搞搞了一个小时,终于搞定样例了发现是题目描述的问题:原来的发电站必须只收b吨!!!!!您倒是说说清楚啊我去...网上过的那些人都是一A的?不敢相信... 1 /************************************************************** 2 Problem: 2426 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:

yzoj1657货仓选址 题解

题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小. 这道题还是比较简单的吧本蒟蒻竟然先想到的是平均数,要去重读小学了,这道题是一道中位数加排序题,至于为什么是中位数这里不予证明. #include<bits/stdc++.h> using namespace std; int n,a[100010]; long long sum,a

bzoj 2426 【HAOI2010】工程选址 贪心

[HAOI2010]工厂选址 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 447  Solved: 308[Submit][Status][Discuss] Description 某地区有m座煤矿,其中第i号矿每年产量为ai吨,现有火力发电厂一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运费为Ci0(i=1,2,…,m).   现规划新建一个发电厂,m座煤矿每年开采的原煤将全部

分支界定法详解

分支界定法是求解整数线性规划最优解的经典方法. 定义: 对有约束条件的最优化问题(其可行解为有限数)的所有可行解空间恰当地进行系统搜索,这就是分支与界定的内容.通常把全部解空间反复地分割为越来越小的子集,称为分枝:并对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界.在每次分枝后,若某个已知可行解集的目标值不能达到当前的界限,则将这个子集舍去.这样,许多子集不予考虑,这称为剪枝.这就是分枝界限法的思路. 背景: 分枝界限法可以用于求解纯整数或混合的整数规划问题.在上世纪六十年代由L

docplex

一.什么是0-1规划问题 0-1规划问题是决策变量仅取值0或1的一类特殊的整数规划.0-1变量可以数量化地描述诸如开与关.取与弃.有与无等现象所反映的离散变量间的逻辑关系.顺序关系以及互斥的约束条件,因此0-1规划问题非常适合描述和解决如线路设计.工厂选址.生产计划安排.旅行购物.背包问题.人员安排等问题. 二.经典0-1规划问题 某公司拟在市东.西.南区建立门市部.备选有7个位\(A_{i}\)(\({i}=1,2,...,7\))可供选择.规定\(A_{1}\).\(A_{2}\).\(A_

P2516 [HAOI2010]最长公共子序列 题解(LCS)

题目链接 最长公共子序列 解题思路 第一思路: 1.用\(length[i][j]\)表示\(a\)串的前\(i\)个字符与\(b\)串的前\(j\)个字符重叠的最长子串长度 2.用\(num[i][j]\)表示 \(a\)串的前\(i\)个字符与\(b\)串的前\(j\)个字符重叠的最长子串个数 则求\(length[i][j],num[i][j]\)时有以下递推关系: \(length[i][j]:\) 如果当前两串结尾字符相等,则\(length[i][j]=length[i-1][j-1

BZOJ2427: [HAOI2010]软件安装

2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1512  Solved: 584[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j

[BZOJ2667][cqoi2012][kcoj]模拟工厂

题目描述 Description 有一个称为"模拟工厂"的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果选择生产商品,则下一个时刻你所拥有的商品数量增加p,其中p是本时刻工厂的生产力. 有n个订单,可以选择接受或者不接受.第i个订单(ti, gi, mi)要求在时刻ti给买家提供gi个商品,事成之后商品数量减少gi,而收入增加mi元.如果接受订单i,则必须恰好在时刻ti交易,不能早也不能晚.