link

试题分析

做这种题就应该去先写个暴力代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int w[N],n,f[N],deep[N],sum,s[N],p[N],k[N];
int calc(int l,int r){
return (p[r]-p[l-])-deep[r]*(k[r]-k[l-]);
}
int main(){
// freopen("5.in","r",stdin);
memset(f,/,sizeof(f));f[]=;
n=read();
for(int i=;i<=n;i++) w[i]=read(),deep[i]=read();
for(int i=n;i>=;i--) deep[i]+=deep[i+];
n++;
for(int i=;i<=n;i++) s[i]=w[i]*deep[i];
for(int i=;i<=n;i++) p[i]=p[i-]+s[i];
for(int i=;i<=n;i++) k[i]=k[i-]+w[i];
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
f[i]=min(f[i],-deep[j]*k[j]-deep[i]*k[i]+deep[i]*k[j]+deep[n]*k[i]);
}
}
int maxn=INT_MAX;
for(int i=;i<=n;i++) maxn=min(maxn,f[i]);cout<<maxn-deep[n]*k[n]+p[n];
}

1

然后再把calc放在里面,把无用的东西提出去。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int w[N],n,f[N],deep[N],sum,s[N],p[N],k[N];
int calc(int l,int r){
return (p[r]-p[l-])-deep[r]*(k[r]-k[l-]);
}
int main(){
// freopen("5.in","r",stdin);
memset(f,/,sizeof(f));f[]=;
n=read();
for(int i=;i<=n;i++) w[i]=read(),deep[i]=read();
for(int i=n;i>=;i--) deep[i]+=deep[i+];
n++;
for(int i=;i<=n;i++) s[i]=w[i]*deep[i];
for(int i=;i<=n;i++) p[i]=p[i-]+s[i];
for(int i=;i<=n;i++) k[i]=k[i-]+w[i];
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
f[i]=min(f[i],-deep[j]*k[j]+deep[i]*k[j]);
}
}
int maxn=INT_MAX;
for(int i=;i<=n;i++) maxn=min(maxn,f[i]-deep[i]*k[i]+deep[n]*k[i]);cout<<maxn-deep[n]*k[n]+p[n];
}

2

然后再斜率优化一下,因为我维护的是最大值,所以维护一个上凸壳即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int w[N],n,f[N],deep[N],sum,s[N],p[N],k[N],l,r,que[N],X[N],Y[N],minn=LLONG_MAX;
signed main(){
// freopen("5.in","r",stdin);
memset(f,/,sizeof(f));f[]=;
n=read();
for(int i=;i<=n;i++) w[i]=read(),deep[i]=read();
for(int i=n;i>=;i--) deep[i]+=deep[i+];
n++;
for(int i=;i<=n;i++) s[i]=w[i]*deep[i];
for(int i=;i<=n;i++) p[i]=p[i-]+s[i];
for(int i=;i<=n;i++) k[i]=k[i-]+w[i];
l=r=,que[]=;Y[]=deep[]*k[],X[]=k[];
for(int i=;i<=n;i++){
while(l<r&&Y[que[l+]]-Y[que[l]]>=deep[i]*(X[que[l+]]-X[que[l]])) l++;
f[i]=deep[i]*k[que[l]]-deep[que[l]]*k[que[l]];
X[i]=k[i],Y[i]=deep[i]*k[i];
while(l<r&&(Y[que[r]]-Y[que[r-]])*(X[i]-X[que[r]])<=(X[que[r]]-X[que[r-]])*(Y[i]-Y[que[r]])) r--;
que[++r]=i;
}
for(int i=;i<=n;i++) minn=min(minn,f[i]-deep[i]*k[i]+deep[n]*k[i]);printf("%lld\n",minn-deep[n]*k[n]+p[n]);
return ;
}

[CEOI2004]锯木厂选址的更多相关文章

  1. P4360 [CEOI2004]锯木厂选址

    P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...

  2. luoguP4360 [CEOI2004]锯木厂选址

    题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...

  3. 动态规划(斜率优化):[CEOI2004]锯木厂选址

    锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...

  4. [BZOJ2684][CEOI2004]锯木厂选址

    BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...

  5. cogs 362. [CEOI2004]锯木厂选址

    ★★★   输入文件:two.in   输出文件:two.out   简单对比 时间限制:0.1 s   内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...

  6. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

  7. LG4360 [CEOI2004]锯木厂选址

    题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...

  8. 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)

    传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...

  9. luogu P4360 [CEOI2004]锯木厂选址

    斜率优化dp板子题[迫真] 这里从下往上标记\(1-n\)号点 记\(a_i\)表示前缀\(i\)里面树木的总重量,\(l_i\)表示\(i\)到最下面的距离,\(s_i\)表示\(1\)到\(i-1 ...

  10. [CEOI2004]锯木厂选址 斜率优化DP

    斜率优化DP 先考虑朴素DP方程, f[i][k]代表第k个厂建在i棵树那里的最小代价,最后答案为f[n+1][3]; f[i][k]=min(f[j][k-1] + 把j+1~i的树都运到i的代价) ...

随机推荐

  1. Qt-QML-Canvas写个小小的闹钟

    先看下演示效果 大致过程 先绘制仪表盘,圆圈和刻度 剩下再绘制三个指针 最后在绘制上面的电子时钟 下面写源代码 import QtQuick 2.0 Rectangle { id:root ancho ...

  2. JavaFX 学习笔记——jfoenix类库学习——raised风格按钮创建

    创建按钮 JFXButton jfxb = new JFXButton("hello"); jfxb.getStyleClass().add("button-raised ...

  3. HttpServletResponse 之 sendError( )

    直接返回http 401状态,提示重新登录 response.sendError(401, "当前账户未登录或会话失效,请重新登录!) HTTP状态码列表: 100Continue继续.客户 ...

  4. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

    1. 摘要 训练深层的神经网络非常困难,因为在训练的过程中,随着前面层数参数的改变,每层输入的分布也会随之改变.这需要我们设置较小的学习率并且谨慎地对参数进行初始化,因此训练过程比较缓慢. 作者将这种 ...

  5. Web全景图的原理及实现

    全景图的基本原理 全景图是一种广角图.通过全景播放器可以让观看者身临其境地进入到全景图所记录的场景中去.比如像是这个.这种看起来很高大上的效果其实背后的原理并不复杂. 通常标准的全景图是一张2:1的图 ...

  6. c# 调用c++dll二次总结

    1.pinvoke结构不对称,添加语句(网上有) 2.含回调函数,成员参数的结构体必须完全,尽管自己用不到. 3.加深对c++指针的理解.一般情况下,类型加*等效于c++中的ref.但对于short* ...

  7. C语言自评

    问卷调查:你对自己的未来有什么规划?做了哪些准备?答:做设计方面的工作:正在努力自学有关这方面的知识 你认为什么是学习?学习有什么用?现在学习动力如何?为什么?答:学习就是增长见识:学习的作用就是为了 ...

  8. Java中的生产者、消费者问题

    Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...

  9. Solr初步研究

    Solr是一个高性能,采用Java5开发,Solr基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供 ...

  10. TFTP服务 简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,默认端口号为69

    (1)yum安装:tftp.tftp-server   (2)启动tftp CentOS 6 service xinetd restart chkconfig tftp on CentOS 7 sys ...