蓝桥杯C组国赛 画廊
精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课蓝桥云课是国内领先的IT在线编程及在线实训学习平台,专业导师提供精选的实践项目,创新的技术使得学习者无需配置繁琐的本地环境,随时在线流畅使用。以就业为导向, 提供编程、运维、测试、云计算、大数据、数据库等全面的IT技术动手实践环境, 提供Linux、Python、Java、C语言、Node.js、Hadoop、PHP、Docker、Git、 R
精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课蓝桥云课是国内领先的IT在线编程及在线实训学习平台,专业导师提供精选的实践项目,创新的技术使得学习者无需配置繁琐的本地环境,随时在线流畅使用。以就业为导向, 提供编程、运维、测试、云计算、大数据、数据库等全面的IT技术动手实践环境, 提供Linux、Python、Java、C语言、Node.js、Hadoop、PHP、Docker、Git、 R、SQL、MongoDB、Redis、Swift、Spark等千门热门课程。https://www.lanqiao.cn/problems/1032/learning/不知道为啥原卷没看到这题。。。但是在蓝桥云课里又是C组国赛的题??
题目描述
小蓝办了一个画展,在一个画廊左右两边陈列了他自己的作品。为了使画展更有意思,小蓝没有等距陈列自己的作品,而是按照更有艺术感的方式陈列。
在画廊的左边陈列了 L 幅作品,在画廊的右边陈列了 R 幅作品,左边的作品距离画廊的起点依次为 u_1, u_2, · · · , u_L,右边的作品距离画廊起点依次为 v_1, v_2, · · · ,v_R。
每周,小蓝要整理一遍自己的每一幅作品。整理一幅作品的时间是固定的,但是要带着沉重的工具。从一幅作品到另一幅作品之间的距离为直线段的长度。
小蓝从画廊的起点的正中央(左右两边的中点)出发,整理好每一幅画,最终到达画廊的终点的正中央。已知画廊的宽为 w。
请问小蓝最少带着工具走多长的距离?
输入描述
输入的第一行包含四个整数 L,R,d,w,表示画廊左边和右边的作品数量,以及画廊的长度和宽度。
第二行包含 L 个正整数 u_1, u_2, · · · , u_L,表示画廊左边的作品的位置。
第三行包含 R 个正整数 v_1, v_2, · · · , v_R,表示画廊右边的作品的位置。
其中有 ,1 ≤ L, R ≤ 500, 1 ≤ d ≤ 10^5, 1 ≤ w ≤ 10^5,0 ≤ u_1 < u_2 < · · · < u_L ≤ d, 0 ≤ v_1 < v_2 < · · · < v_R ≤ d
输出描述
输出一个实数,四舍五入保留两位小数,表示小蓝最少带着工具走的距离。
输入输出样例
示例
输入
3 3 10 2
1 3 8
2 4 6
输出
14.71
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
Solution:
这题目我一开始压根没看懂!!!!阅读理解杯名副其实!!我刚开始以为画廊是这样的
起点
左边画3 左边画2 左边画1 右边画1 右边画2 右边画3
以至于我一开始压根就没看懂这题目的意思然后一直在想为什么会有浮点距离???后来我才发现是这样的
↓ 起点 ↓
↓ ↓ 右距离1
↓ 左距离1 右边画1
左边画1
终点
也就是是一个长的画廊!!所以蓝桥这种题不能给张图吗!!!看的我真难受
回归正题:
理解了题意,那本题就不难了我们定义状态转移方程
dp[i][j]为处理完左边i副画和右边j副画时走的路程的最小值,
但转移的时候我们就可以发现,没办法确定自己是先处理的左边第i副画还是右边第j副画,就不知道当前位置,无法进行状态转移.于是我们再加一维 dp[i][j][k]表示处理完左边第i副画和右边第j副画时在k位置的最短距离,k只有0或1,0表示在左边第i副画,1表示在右边第j副画那么很容易可以想出,如果在左边第i副画时,由于已经处理好了右边的前j副画,那么我们要么是从右边第j副画过来的,要么是从左边i-1副画过来的
所以:
dp[i][j][0] = min(dp[i-1][j]+dis(i,i-1),dp[i][j][1]+dis(j,i))
dp[i][j][1]同理,最后计算其与终点的距离即可
Code:
#include <bits/stdc++.h>
using namespace std;
double dp[505][505][2];
double ld[505],rd[505];
double d,w;
int L,R;
double dis(double x1,double x2,double w)
{
return sqrt((x1-x2)*(x1-x2)+w*w);
}
int main()
{
memset(dp,127,sizeof(dp));
cin>>L>>R>>d>>w;
for(int i = 1;i<=L;++i) cin>>ld[i];
for(int i = 1;i<=R;++i) cin>>rd[i];
dp[1][0][0] = dis(ld[1],0,w/2);
dp[0][1][1] = dis(rd[1],0,w/2);
for(int i = 0;i<=L;++i)
for(int j = 0;j<=R;++j)
{
if(i) dp[i][j][0] = min(dp[i][j][0],min(dp[i][j][0],min(dp[i-1][j][0]+ld[i]-ld[i-1],dp[i-1][j][1]+dis(ld[i],rd[j],w))));
if(j) dp[i][j][1] = min(dp[i][j][1],min(dp[i][j][1],min(dp[i][j-1][1]+rd[j]-rd[j-1],dp[i][j-1][0]+dis(rd[j],ld[i],w))));
}
double ans = min(dp[L][R][0]+dis(ld[L],d,w/2),dp[L][R][1]+dis(rd[R],d,w/2));
printf("%.2lf",ans);
return 0;
}
更多推荐
所有评论(0)