原题链接:蓝桥杯2023年第十四届省赛真题-蜗牛
解题思路:
DP三步法
第一步 确认dp元素
a[i]:第i根竿子上的传送门起点
b[i]:第i根竿子上的传送门终点对应a[i-1]
x[i]:第i根竿子到原点的水平距离
第二步 明确状态,得到状态转移方程
蜗牛最终状态为地面状态T(i)
T(i)可以通过T(i-1)+d得到
也可以通过抵达传送终点时间D(i)+往下爬行时间c[i]得到
传送终点可以由同竿子上的一个传送起点爬行抵达,也可以通过T(i-1)+地面爬行抵达d+向上爬行抵达up(i)
D(i)=D(i-1)+min(|b[i]-a[i-1]|,d+up(i))
d=x[i]-x[i-1]*1.0/1.0
由递推关系得到两个状态D(i),T(i)
T(i)=min(T(i-1)+d , D(i)+c(i));
D(i)=min(T(i-1)+|b[i]-a[i-1]| , T[i-1]+d+up(i))
第三步 数据初始化
由于O点无传送门到达1竿只能通过地面爬行
T(0)=d;
D(0)=d+up(0);
参考代码:
import java.io.*; public class Main { public static StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); public static void main(String[] args) throws IOException { int n=nextInt(); int[] x=new int[n];//第i根竹竿距离原点的距离 int[] a =new int[n];//第i根竹竿上传送门的高度 int[] b=new int[n];//从第i个传送门传送到第i+1根竹竿后蜗牛所在的高度 double[] footMin=new double[n];//footMin[i]表示从原点到达第i根竹竿底部的最短时间 double[] doorMin=new double[n];//doorMin[i]表示从原点到达第i根竹竿传送门的最短时间 for (int i=0;i<n;i++) { x[i]=nextInt(); } for (int i=0;i<n-1;i++){ a[i]=nextInt(); b[i]=nextInt(); } footMin[0]=x[0]*1.0; doorMin[0]=x[0]*1.0+a[0]*1.0/0.7; int d; for(int i=1;i<n;i++) { d=x[i]-x[i-1]; if(b[i-1]>a[i]) { doorMin[i]=Math.min(doorMin[i-1]+(b[i-1]-a[i])*1.0/1.3,footMin[i-1]+d+a[i]*1.0/0.7); } else { doorMin[i]=Math.min(doorMin[i-1]+(a[i]-b[i-1])*1.0/0.7,footMin[i-1]+d+a[i]*1.0/0.7); } footMin[i]=Math.min(doorMin[i-1]+b[i-1]*1.0/1.3,footMin[i-1]+d*1.0); } System.out.println(String.format("%.2f",footMin[n-1])); } private static int nextInt() throws IOException { st.nextToken(); return (int)st.nval; } }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复