zoukankan      html  css  js  c++  java
  • 【CEOI2004】锯木厂选址

    【题目描述】

    从山顶上到山底下沿着一条直线种植了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分。

    【输出描述】

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

    【分析】

    斜率优化,看别人的,只提供代码,以后慢慢总结。(觉得自己实在是太水了==)

    贴上链接:

    http://wenku.baidu.com/linkurl=ptHSVhAevtr4BAOqM6U8MOzdJjFd_bjtEVcm34UULAEEnXXrltD6qERloCsy1CwgnjDY65pffDK3f7xWzvIztYntVK7z5c8iGinaP2EBaK7

     1 #include <cstdlib>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <algorithm>
     7 const int maxn=30005;
     8 const int INF=2000000005;
     9 using namespace std;
    10 int sw[maxn],sd[maxn],cost[maxn],Q[2*maxn];
    11 inline double g(int i,int j) {return ((sw[i]*sd[i]-sw[j]*sd[j]*1.0)/(sw[i]-sw[j]));}
    12 inline int all(int i,int j) {return cost[j]-cost[i-1]-sw[i-1]*(sd[j]-sd[i-1]);}
    13 int main()
    14 {
    15     int n,i,front=1,rear=1,ans=INF,w,d;
    16     //文件操作
    17     freopen("two.in","r",stdin);
    18     freopen("two.out","w",stdout);
    19     memset(sw,0,sizeof(sw));
    20     memset(sd,0,sizeof(sd));
    21     memset(cost,0,sizeof(cost));
    22     scanf("%d",&n);
    23     //从山顶往下输入 
    24     for (i=1;i<=n;i++)
    25     {
    26         scanf("%d%d",&w,&d);
    27         sw[i]=sw[i-1]+w;
    28         sd[i+1]=sd[i]+d;
    29         cost[i+1]=cost[i]+sw[i]*d;
    30     }Q[1]=1;//初始化队列 
    31     for (i=2;i<=n;i++)
    32     {
    33         //满足队列单调性 
    34         while (front<rear && g(Q[front],Q[front+1])<=sd[i]) front++;
    35         ans=min(ans,cost[Q[front]]+all(Q[front]+1,i)+all(i+1,n+1));
    36         while (front<rear && g(Q[rear],i)<g(Q[rear-1],Q[rear]))rear--;//弹出队列 
    37         Q[++rear]=i;//加入队列 
    38     }
    39     printf("%d
    ",ans);
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    git version info & svn version info map(七)
    /proc/pid/statm content analysis
    git log filter(六)
    git create remote branch (五)
    learning svn diff --summarize
    learning scala akka ask_pattern
    learning scala akka tell pattern(二)
    learning scala akka actorySystem create and close
    hibernate 自动生成数据库
    STRICT_TRANS_TABLES STRICT_ALL_TABLES
  • 原文地址:https://www.cnblogs.com/hoskey/p/3737884.html
Copyright © 2011-2022 走看看