Codeforces 988F Rain and Umbrellas(DP)
题目链接:http://codeforces.com/contest/988/problem/F
题目大意:
有三个整数a,n,m,a是终点坐标,给出n个范围(l,r)表示这块区域下雨,m把伞(p,w)在点p有重量为w的伞。
小明可以携带任意数量的伞,经过下雨处时必须要撑伞,小明每走一个单位长度消耗的体力与他所携带伞的重量相同,
求小明从0~a所需消耗的最少体力,若无解则输出-1。
解题思路:
第一种解法:
设dp[i]表示到达i点所需花费的最少体力,rain[i]表示第i段是否下雨(注意是段不是点),ub[j]表示j点放置的伞的重量。
则当rain[i-1]=false时,dp[i]=dp[i]-1
rain[i-1]=true是,dp[i]=min{dp[j]+(i-j)*ub[j]},(ub[j]!=1e18且j<=i-1)
复杂度O(n^2)
第二种解法:
设dp数组,
dp[i][0]表示到达第i段不拿伞最小花费
dp[i][1]表示到达第i段拿伞最小化费
dp[i][2]表示到达第i段拿最小重量的伞的最小化费
然后不想说了,各种递推就是了。。。
复杂度O(n)
代码:
解法一:
#include<bits/stdc++.h>
#define lc(a) (a<<1)
#define rc(a) (a<<1|1)
#define MID(a,b) ((a+b)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define clr(arr,val) memset(arr,val,sizeof(arr))
#define _for(i,start,end) for(int i=start;i<=end;i++)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long LL;
const int N=2e3+;
const int INF=0x3f3f3f3f;
const double eps=1e-; LL dp[N],ub[N];
bool rain[N]; int main(){
FAST_IO;
int a,n,m;
cin>>a>>n>>m;
for(int i=;i<N;i++){
dp[i]=ub[i]=1e18;
}
for(int i=;i<=n;i++){
int l,r;
cin>>l>>r;
if(l>r) swap(l,r);
for(int j=l;j<=r-;j++){
rain[j]=true;
}
}
for(int i=;i<=m;i++){
LL p,w;
cin>>p>>w;
ub[p]=min(ub[p],w);
}
dp[]=;
for(int i=;i<=a;i++){
if(!rain[i-]){
dp[i]=dp[i-];
}
else{
for(int j=i-;j>=;j--){
if(ub[j]!=1e18)
dp[i]=min(dp[i],dp[j]+(i-j)*ub[j]);
}
}
}
if(dp[a]==1e18)
cout<<-<<endl;
else
cout<<dp[a]<<endl;
return ;
}
解法二:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<string.h>
#include<cctype>
#include<math.h>
#include<stdlib.h>
#include<stack>
#include<queue>
#include<set>
#include<map>
#define lc(a) (a<<1)
#define rc(a) (a<<1|1)
#define MID(a,b) ((a+b)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define clr(arr,val) memset(arr,val,sizeof(arr))
#define _for(i,start,end) for(int i=start;i<=end;i++)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long LL;
const int N=2e3+;
const int INF=0x3f3f3f3f;
const double eps=1e-; bool rain[N],flag[N];
LL dp[N][],ub[N];
//dp[i][0]表示到达第i段不拿伞最小花费
//dp[i][1]表示到达第i段拿伞最小化费
//dp[i][2]表示到达第i段拿最小重量的伞的最小化费 int main(){
FAST_IO;
int a,n,m;
cin>>a>>n>>m;
for(int i=;i<N;i++){
ub[i]=dp[i][]=dp[i][]=dp[i][]=1e18;
}
for(int i=;i<=n;i++){
int l,r;
if(l>r)
swap(l,r);
cin>>l>>r;
for(int j=l;j<=r-;j++){
rain[j]=true;
}
}
for(int i=;i<=m;i++){
LL p,w;
cin>>p>>w;
ub[p]=min(ub[p],w);
} if(!rain[])
dp[][]=;
dp[][]=dp[][]=ub[];
LL mmin=ub[],now=ub[];
for(int i=;i<=a-;i++){
if(ub[i]){
mmin=min(ub[i],mmin);
now=min(ub[i],now);
}
LL t=min(dp[i-][]+now,dp[i-][]+mmin);
dp[i][]=t;
if(t==dp[i-][]+mmin)
now=mmin;
dp[i][]=dp[i-][]+mmin; //下雨
if(rain[i]){
//有伞
if(ub[i]){
dp[i][]=min(dp[i-][]+ub[i],dp[i][]);
if(dp[i][]==dp[i-][]+ub[i])
now=ub[i];
if(mmin==ub[i]){
dp[i][]=min(dp[i-][]+mmin,dp[i][]);
}
}
}
//不下雨
else{
dp[i][]=min(dp[i-][],dp[i-][]);
//有伞
if(ub[i]){
dp[i][]=min(dp[i-][]+ub[i],dp[i][]);
if(dp[i][]==dp[i-][]+ub[i])
now=ub[i];
if(mmin==ub[i]){
dp[i][]=min(dp[i-][]+mmin,dp[i][]);
}
}
}
}
LL ans=min(dp[a-][],dp[a-][]);
if(ans!=1e18)
cout<<ans<<endl;
else
cout<<-<<endl;
return ;
}
Codeforces 988F Rain and Umbrellas(DP)的更多相关文章
- Codeforces 988F. Rain and Umbrellas
解题思路:动态规划 遍历点i,如果从前一个点i-1走到这个点i不需要伞,则疲劳值不变dp[i] = dp[i-1]. 如果前一个点i-1走到这一个点i需要伞,则从前面找一把伞. 即遍历前面的每个点j, ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- CodeForces 988 F Rain and Umbrellas
Rain and Umbrellas 题意:某同学从x=0的点走到x=a的点,路上有几段路程是下雨的, 如果他需要经过这几段下雨的路程, 需要手上有伞, 每一把伞有一个重量, 求走到重点重量×路程的最 ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Rain and Umbrellas(dp)
题目链接 http://codeforces.com/problemset/problem/988/F 令dp[i][j]为走到目标为i处,手里拿着第j把伞,同时注意,在某处可能存在不止一把伞 #in ...
- Codeforces Round #486-F.Rain and Umbrellas题解
一.题目链接:http://codeforces.com/contest/988/problem/F 二.题面 三.思路 很明显而且比较能想到的$dp$. 四.代码实现 #include<bit ...
- codeforces 721C (拓排 + DP)
题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知 ...
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
随机推荐
- 【数据结构】【CF1073D】 Berland Fair
Description 给定 \(n\) 个商店,他们围成一个圆圈,按照顺时针从 \(1\) 到 \(n\) 编号.你有 \(T\) 元钱,从 \(1\) 号点开始按照顺时针方向走,每到一个商店,只要 ...
- tar 命令显示进度条
实现该功能需要安装 pv,然后把需要处理的数据通过管道传给 pv,最后再进行操作. 传给 pv 的目的是为了知道已经处理的数据量大小,同时需要通过 -s 指定总共需要处理的数据量大小. pv 的安装一 ...
- Chapter6(函数) --C++Prime笔记
1.重载函数,也就是说一个名字可以对应几个不同的函数. 2.内置类型的未初始化局部变量将产生未定义的值. 3.局部静态对象在程序执行路径第一次进过对象定义语句时初始化,并且直到程序终止才被销毁. 内置 ...
- Docker应用四:搭建docker镜像仓库(包括自生成https证书、登陆认证)
利用docker官网提供的registry镜像创建私有仓库 一.首先从docker官网拉取registry镜像: docker pull registry 二.然后运行该镜像: docker run ...
- vue的全局指令
vue有四个全局指令:directive.extent.set.component directive:自定义指令 //写一个改变颜色的指令 Vue.directive('amie',function ...
- Tomcat权威指南-读书摘要系列3
3. 在Tomcat中部署Servlet与JSP Web应用程序 jar命令打包war文件 jar cvf examples.war .
- Hadoop生态圈-使用phoenix的API进行JDBC编程
Hadoop生态圈-使用phoenix的API进行JDBC编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- JS获取FckEditor的值
不需要在页面引用任何额外的JS文件 //获取编辑器中HTML内容 function getEditorHTMLContents(EditorName) { var oEditor = FCKedito ...
- Mysql 插入时间时报错Incorrect datetime value: '' for column 'createtime'
在网上找了很多方法总结如下: 1.MySQL驱动版本的问题.这种一般是在mYSQL版本更新了之后才会报错.解决方法在jdbc里添加“&useOldAliasMetadataBehavior=t ...
- 前端案例分享(一):CSS+JS实现流星雨动画
目录 引言 1.效果图 2.源码 3.案例解析 4.小问题 5.结语 引言 平常会做一些有意思的小案例练手,通常都会发到codepen上,但是codepen不能写分析. 所 ...