• [ZJOI2007]仓库建设


    Description

      L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内
    陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象
    部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于
    地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库
    的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设
    置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,
    假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到
    以下数据:1:工厂i距离工厂1的距离Xi(其中X1=0);2:工厂i目前已有成品数量Pi;:3:在工厂i建立仓库的费用
    Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。

    Input

      第一行包含一个整数N,表示工厂的个数。接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。

    Output

      仅包含一个整数,为可以找到最优方案的费用。

    Sample Input

    3
    0 5 10
    5 3 100
    9 6 10

    Sample Output

    32
     
     
     
     
    斜率优化问题,因为数据范围的问题一直WA
    原来在计算int*int+long long的时候会先以int类型算int*int,这个时候可能会溢出
    所以要把int弄成long long类型
    还有就是求斜率的时候防止整数除整数
     
     1 #include<iostream>
     2 #include<string>
     3 #define LL long long
     4 #define N 1000001
     5 using namespace std;
     6  
     7 LL d[N]={0},p[N]={0},c[N]={0};
     8 LL tot[N]={0};//1~i的工厂中物品总数 
     9 LL w[N]={0};//1~i工厂中物品运到工厂1的费用 
    10 LL f[N]={0};
    11 int n,Q[N]={0};
    12  
    13 LL cal(int j,int i){
    14     return f[j]+w[j]-d[i]*tot[j];
    15            }
    16 double slope(int j,int i){
    17        LL y2=f[i]+w[i];
    18        LL y1=f[j]+w[j];
    19        LL x2=tot[i];
    20        LL x1=tot[j];
    21        return (y2-y1)*1.0/(x2-x1);
    22        }
    23 int main()
    24 {
    25     cin>>n;
    26     for(int i=1;i<=n;++i)
    27     {
    28       cin>>d[i]>>p[i]>>c[i];
    29       tot[i]=p[i];
    30       tot[i]+=tot[i-1];
    31             }
    32      
    33     for(int i=1;i<=n;++i)
    34     {
    35       w[i]=d[i]*p[i];
    36       w[i]+=w[i-1];
    37             } 
    38      
    39     int head=0,tail=0;
    40     for(int i=1;i<=n;++i)
    41     {
    42       while(head<tail&&cal(Q[head],i)>cal(Q[head+1],i)) head++;
    43       int j=Q[head];
    44       f[i]=f[j]+d[i]*(tot[i]-tot[j])-w[i]+w[j]+c[i];
    45       while(head<tail&&slope(Q[tail-1],Q[tail])>slope(Q[tail],i)) tail--;
    46       Q[++tail]=i;      
    47             }
    48      
    49      
    50      
    51     cout<<f[n]<<endl;
    52      
    53      
    54  //   system("pause"); 
    55      
    56     } 
  • 相关阅读:
    Laravel模型间关系设置分表方法详解
    11个PHP程序员最常犯的MySQL错误
    教你使用swoole监听redis数据
    使用 Docker 环境来开发 PHP,Laradock 系列 1
    tp5 workerman安装不上解决方法
    一种颗粒度很小的 Laravel 路由文件划分方式
    VT 调试环境搭建
    masm32基本配置与写出第一个汇编程序
    [debug] 解决pycharm中无法import自己建立的模块问题
    《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
  • 原文地址:https://www.cnblogs.com/noip/p/7931100.html
Copyright © 2020-2023  润新知