zoukankan      html  css  js  c++  java
  • cogs 362. [CEOI2004]锯木厂选址

                    ★★★   输入文件:two.in   输出文件:two.out   简单对比
                      时间限制:0.1 s   内存限制:32 MB

    从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。
    木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。假定运输每公斤木材每米需要一分钱。

    输入

    输入的第一行为一个正整数n——树的个数(2≤n≤20 000)。树从山顶到山脚按照1,2……n标号。接下来n行,每行有两个正整数(用空格分开)。第i+1行含有:wi——第i棵树的重量(公斤为单位)和 di——第i棵树和第i+1棵树之间的距离,1≤wi ≤10 000,0≤di≤10 000。最后一个数dn,表示第n棵树到山脚的锯木厂的距离。保证所有树运到山脚的锯木厂所需要的费用小于2000 000 000分。

    输出

    输出只有一行一个数:最小的运输费用。

    样例

    输入

    9
    1 2
    2 1
    3 3
    1 1
    3 2
    1 6
    2 1
    1 2
    1 1

    输出

    26

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 using namespace std;
    10 typedef long long LL;
    11 typedef double db;
    12 const int maxn=20010;
    13 LL ANS=1e15;
    14 int N,w[maxn],d[maxn],Sw[maxn],Sd[maxn],cost[maxn];
    15 int Q[maxn],head,tail=-1; 
    16 inline double calc(int j1,int j2){
    17     return ((db)Sw[j1]*(db)Sd[j1]-(db)Sw[j2]*(db)Sd[j2])/((db)Sw[j1]-(db)Sw[j2]);
    18 }
    19 inline int All(int j,int i){
    20     return cost[i]-cost[j-1]-Sw[j-1]*(Sd[i]-Sd[j-1]);
    21 }
    22 inline LL ask_ans(int j,int i){
    23     return (LL)cost[j]+(LL)All(j+1,i)+(LL)All(i+1,N+1);
    24 }
    25 int main(){
    26     //freopen("two.in","r",stdin);
    27     //freopen("two.out","w",stdout);
    28     scanf("%d",&N);
    29     for(int i=1;i<=N;i++){
    30         scanf("%d%d",&w[i],&d[i]);
    31         Sw[i]=Sw[i-1]+w[i];
    32          Sd[i+1]=Sd[i]+d[i];
    33          cost[i]=cost[i-1]+Sw[i-1]*d[i-1];
    34     }
    35     cost[N+1]=cost[N]+Sw[N]*d[N];
    36     Sw[N+1]=Sw[N];
    37     for(int i=1;i<=N;i++){
    38         while(head<tail&&calc(Q[head],Q[head+1])<=Sd[i]){
    39              head++;
    40          }
    41         ANS=min(ANS,ask_ans(Q[head],i));
    42         while(head<tail&&calc(Q[tail-1],Q[tail])>calc(Q[tail],i)){
    43              tail--;
    44          }
    45          Q[++tail]=i;
    46     }
    47     printf("%lld",ANS);
    48     return 0;
    49 }

      

  • 相关阅读:
    csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法
    java 随机数 优惠码 生成 随机字串
    JSF primefaces session view expired 会话失效后页面跳转
    primefaces 查询 点击按钮 加载 动画 ajax loader
    时间戳 时区 java mysql
    JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
    MQTT 消息 发布 订阅
    mosquitt win32
    Hibernate JPA实体继承的映射(一) 概述
    wildfly jboss 优化配置
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/5416158.html
Copyright © 2011-2022 走看看