bzoj 2426 【HAOI2010】工程选址 贪心

[HAOI2010]工厂选址

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 447  Solved: 308
[Submit][Status][Discuss]

Description

某地区有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座煤矿开采的原煤应如何分配给两个发电厂,才能使每年的总费用(发电厂运行费用与原煤运费之和)为最小。 

Input

第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

Output

第1行:新厂址编号,如果有多个编号满足要求,输出最小的。

第2行:总费用 

Sample Input

4 2 7 9
3 1 10 3
6 3 7 1 10 2 7 4 9
1 2 4 3
6 6 8 2
4 10 8 4
10 2 9 2
7 6 6 2
9 3 7 1
2 1 6 9
3 1 10 9
4 2 1 8
2 1 3 4

Sample Output

8
49

HINT

对于所有数据, n<=50, m<=50000, b<=10000 

先假设把所有的煤都放到新工厂,然后对于每一个煤矿场都存一下新老费用的差,然后从小到大排序,,再用原来的费用加上老的费用,

相当于你加上了老的而不用了新的,直到加到老厂有d吨煤为止。枚举一下每一个新厂就行了。

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<algorithm>
 6
 7 #define N 57
 8 #define M 50007
 9 #define ll long long
10 using namespace std;
11 inline int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
15     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
16     return x*f;
17 }
18
19 int m,b,n;
20 int a[M],h[N<<1],map[N][M];
21 int ans[N<<1],mmin;
22 struct node
23 {
24     int a,c1,c2,cha,s;
25 }s[M];
26
27 bool cmp(node n1,node n2) {return n1.cha>n2.cha;}
28 int main()
29 {
30     m=read(),b=read(),h[0]=read(),n=read();
31     for(int i=1;i<=m;i++) a[i]=read();
32     for(int i=1;i<=n;i++) h[i]=read();
33     for(int i=0;i<=n;i++)
34         for(int j=1;j<=m;j++)
35             map[i][j]=read();
36     mmin=999999999;
37     for(int i=1;i<=n;i++)
38     {
39         for(int j=1;j<=m;j++) {s[j].s=a[j];s[j].a=a[j];s[j].c1=map[0][j];s[j].c2=map[i][j];s[j].cha=map[i][j]-map[0][j];}
40         sort(s+1,s+1+m,cmp);int t=b,sum=0;
41         for(int j=1;j<=m;j++)
42         {
43             if(t!=0)
44             {
45                 if(t>=s[j].s) {t-=s[j].s;sum+=s[j].s*s[j].c1;}
46                 else {sum+=t*s[j].c1+(s[j].s-t)*s[j].c2;t=0;}
47             }else sum+=s[j].s*s[j].c2;
48         }
49         ans[i]=sum+h[0]+h[i];mmin=min(mmin,ans[i]);
50     }
51     for(int i=1;i<=n;i++)
52         if(ans[i]==mmin)
53             {printf("%d\n%d\n",i,ans[i]);return 0;}
54 }

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8745906.html

时间: 2024-12-10 05:05:49

bzoj 2426 【HAOI2010】工程选址 贪心的相关文章

BZOJ 1029 建筑抢修(贪心堆)

原题代号:BZOJ 1029 原题描述: 建筑抢修 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑.如果某个建筑在一段时间之内没有完全修理完毕,这个建

BZOJ2426 [HAOI2010]工厂选址

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

BZOJ 1029: [JSOI2007]建筑抢修 贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建

BZOJ [ZJOI2008]泡泡堂BNB 贪心

[ZJOI2008]泡泡堂BNB Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1034 Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定

BZOJ 2424: [HAOI2010]订货 费用流

2424: [HAOI2010]订货 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2424 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后

[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座煤矿

BZOJ 3671 NOI2014 随机数生成器 贪心+暴力

题目大意:.....有点长自己看吧 首先既然是排序后的序列字典序最小,那么一定要选尽量小的数字走 然后T是1~m*n的序列 所以不存在重复(一开始我居然把这个条件看漏了) 好的这题贪心 每次选择没有被标记的最小点,然后把左下方和右上方都标记掉(记得标记重复时break,不然就挂了) 注意5000*5000的数组开两个int就是极限了 开多了妥妥MLE 所以T数组记得重复利用 暴力跑了38秒 不过这题每一行能够选择的区域一定是连续的 可以对于每一行维护一个l和r 每次更新取最值即可 这个代码跑了2

BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

题目大意:n个建筑须要抢修.第i个建筑须要T1时间抢修.必须在T2时间之前抢修完成.求最多能抢修多少建筑 首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据: 5 10 10 10 20 2 21 2 21 2 21 贪心仅仅能修理前两个.而实际上最多能够修理4个 于是我们考虑修正贪心算法 比方说这组数据,当我们枚举到3的时候.尽管已经无法修理很多其它了,可是我们能够取消修理建筑1而改修理3.这样尽管不能更新ans 可是能够为后面的建筑节省时间 所以做法就非常明白了 我们

[BZOJ 2423] [HAOI2010] 最长公共子序列

2423: [HAOI2010]最长公共子序列 Time Limit: 10 SecMemory Limit: 128 MB Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij = yj.例如,X=“ABCBDA