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

题解:贪心;

这题比较直接,只让求使费用最小,没有收益这一项限制,所以一维的贪心就够了;

主要操作:排序;

提醒:答案可能超出int范围,以及注意数组范围;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
#define FILE "dealing"
#define LL long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define pii pair<LL,LL>
#define piii pair<LL,pair<LL,LL> >
template<typename T> inline bool chkmin(T &a,T b){return a>b?a=b,true:false;}
template<typename T> inline bool chkmax(T &a,T b){return a<b?a=b,true:false;}
namespace IO{
    char *fs,*ft,buf[1<<15];
    inline char gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
    inline int read(){
        LL x=0;int ch=gc();bool f=0;
        while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=gc();}
        while(ch<=‘9‘&&ch>=‘0‘){x=(x<<1)+(x<<3)+ch-‘0‘;ch=gc();}
        return f?-x:x;
    }
}using namespace IO;
namespace OI{
    const LL maxn(50100),inf(100000000000LL),mod(10000);
    int M,B,H,N;
    int a[maxn],h[maxn],c[55][maxn];
    struct node{
        int id,d;
        inline bool operator<(const node& b)const{return d<b.d;}
    }e[maxn];
    void slove(){
        M=read(),B=read(),H=read(),N=read();
        up(i,1,M)a[i]=read();
        up(i,1,N)h[i]=read();
        up(i,0,N)up(j,1,M)c[i][j]=read();//由j厂运到i位置
        LL Min=inf,Id;
        up(i,1,N){
            up(j,1,M)e[j].id=j,e[j].d=c[0][j]-c[i][j];
            sort(e+1,e+M+1);
            LL sum=0,t=0;
            up(j,1,M){
                if(sum<B){
                    sum+=a[e[j].id];
                    t+=c[0][e[j].id]*a[e[j].id];
                    if(sum>B){
                        t=t-(sum-B)*c[0][e[j].id]+(sum-B)*c[i][e[j].id];
                        sum=B;
                    }
                }
                else t+=c[i][e[j].id]*a[e[j].id];
            }
            t+=H+h[i];
            if(t<Min)Min=t,Id=i;
        }
        printf("%I64d\n%I64d\n",Id,Min);
    }
}
int main(){
    freopen(FILE".in","r",stdin);
    freopen(FILE".out","w",stdout);
    using namespace OI;
    slove();
    return 0;
}
时间: 2024-12-08 20:45:43

[haoi2010]工厂选址的相关文章

BZOJ2426 [HAOI2010]工厂选址

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

【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座煤矿开采

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_

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

工厂ERP系统对企业高效管理的好处是什么?

对于工厂类企业来说,无论是小到厨具工厂,大到汽车工厂,再到航天设备工厂,其生产流程都是复杂,从开始的产品设计到零部件等所有物料的采购,再到生产组装,测试再调试,再到完成,需要经历几十上千步工序与细节,工厂的管理工作难度,那是相当大,但是,随着数据信息化系统的普及,工厂类企业实现智能高效化管理的愿望,得以实现,在这里,我们以工厂ERP系统为例,讲述一下工厂ERP系统对工厂类企业实现智能高效化管理的作用. 1.各环节工作,无缝流转 信息的沟通直观重要,对于企业来说,信息的沟通越是顺通,那么办公效率也

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

简单工厂模式

目前正在看<大话设计模式>,写此系列的文章记录下学习的经过. 简单工厂模式 先看如下代码,使用面向对象的原理实现计算器功能 Operation运算类 1 public class Operation 2 { 3 private double numberA = 0; 4 private double numberB = 0; 5 6 public double NumberA 7 { 8 get { return numberA; } 9 set { numberA = value; } 10