[CEOI2004]锯木厂选址
试题分析
做这种题就应该去先写个暴力代码
#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]锯木厂选址的更多相关文章
- P4360 [CEOI2004]锯木厂选址
P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...
- luoguP4360 [CEOI2004]锯木厂选址
题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
- [BZOJ2684][CEOI2004]锯木厂选址
BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...
- cogs 362. [CEOI2004]锯木厂选址
★★★ 输入文件:two.in 输出文件:two.out 简单对比 时间限制:0.1 s 内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
- LG4360 [CEOI2004]锯木厂选址
题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...
- 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...
- luogu P4360 [CEOI2004]锯木厂选址
斜率优化dp板子题[迫真] 这里从下往上标记\(1-n\)号点 记\(a_i\)表示前缀\(i\)里面树木的总重量,\(l_i\)表示\(i\)到最下面的距离,\(s_i\)表示\(1\)到\(i-1 ...
- [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的代价) ...
随机推荐
- Selenium2+python自动化-文件上传
前言 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻松解决:另外一种非 ...
- 广东ACM省赛 E题
题意: 输入一个P 使得存在一个一个N大于等于P, 并且存在m 等于 m/n * (m-1)/(n-1)=1/2. 思路 此题可以利用佩尔方程求解, 也可以打表解决.本次我解决利用的是佩尔方程(其实也 ...
- Mysql 单表主从同步
先配主从同步,后将主库表老数据传输到从库 说明:api-server的数据库为主,其他harbor为从 1.master 配置文件更改 [mysqld] log-bin = mysql-bin ser ...
- redis 常用命令 结合php
这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型.list类型和set类型的数据,需要的朋友可以参考下 redis的操作很多的,以 ...
- “Hello World!”团队第五周第三次会议
今天是我们团队“Hello World!”团队第五周召开的第三次会议. 双十一大家过的怎么样?由于组内其他成员被“剁手”,今日会议记录由我来写. 博客内容: 一.会议时间 二.会议地点 三.会议成员 ...
- (工具类)MD5算法|时间格式转换|字符串转数字
package vote.utils; import java.security.MessageDigest; import java.text.SimpleDateFormat; import ja ...
- 博弈---威佐夫博奕(Wythoff Game)
这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况下是颇为复杂 ...
- java程序连接MySQL数据库
驱动程序:mysql-connector-java-5.1.7-bin.jar. 程序示例如下: package commonProject; import java.sql.Connection; ...
- application/x-www-form-urlencoded 与 application/json区别
两种请求方式对服务器端都没什么影响 application/x-www-form-urlencoded方式是比较老的一种方式,这种方式的好处就是浏览器都支持, 在请求发送过程中会对数据进行序列化处理, ...
- Linux服务器ping不通域名出现的unknown host 错误解决办法
"ping: unknown host www.baidu.com" 解决方法 如果某台Linux服务器ping不通域名, 如下提示: # ping www.baidu.compi ...