cogs 362. [CEOI2004]锯木厂选址
2016-04-21 11:13
295 查看
★★★ 输入文件:
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
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; typedef long long LL; typedef double db; const int maxn=20010; LL ANS=1e15; int N,w[maxn],d[maxn],Sw[maxn],Sd[maxn],cost[maxn]; int Q[maxn],head,tail=-1; inline double calc(int j1,int j2){ return ((db)Sw[j1]*(db)Sd[j1]-(db)Sw[j2]*(db)Sd[j2])/((db)Sw[j1]-(db)Sw[j2]); } inline int All(int j,int i){ return cost[i]-cost[j-1]-Sw[j-1]*(Sd[i]-Sd[j-1]); } inline LL ask_ans(int j,int i){ return (LL)cost[j]+(LL)All(j+1,i)+(LL)All(i+1,N+1); } int main(){ //freopen("two.in","r",stdin); //freopen("two.out","w",stdout); scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d%d",&w[i],&d[i]); Sw[i]=Sw[i-1]+w[i]; Sd[i+1]=Sd[i]+d[i]; cost[i]=cost[i-1]+Sw[i-1]*d[i-1]; } cost[N+1]=cost +Sw *d ; Sw[N+1]=Sw ; for(int i=1;i<=N;i++){ while(head<tail&&calc(Q[head],Q[head+1])<=Sd[i]){ head++; } ANS=min(ANS,ask_ans(Q[head],i)); while(head<tail&&calc(Q[tail-1],Q[tail])>calc(Q[tail],i)){ tail--; } Q[++tail]=i; } printf("%lld",ANS); return 0; }
相关文章推荐
- Android项目开发实战之使用Fragment和FragmentTabHost搭建底部菜单(一)
- 使用ZooKeeper实现配置同步
- 三层交换机是否会代替路由器?
- java NIO selector全面深入理解
- swap&& ADL
- ABAP 读取销售订单抬头文本自建函数
- 全面理解line-height与vertical-align
- App架构经验总结
- 检测域名是否存在
- 关于UE4动态资源加载(蓝图类)
- springmvc,shiro整合
- Zabbix2.4安装和问题总结(一)
- Android 5.0中使用JobScheduler
- tomcat简介
- Objective-C消息机制的原理
- C++实验4-利用循环求和
- 上传图片
- oop魔术方法
- 50道经典Java逻辑编程题--1~3
- Facebook的Android调试工具Stetho