当前位置: 首页 > article >正文

每日一题(4)

有一只蜗牛位于二维坐标系的原点(0,0),在x轴上有n根平行于y轴的竹竿,它们底部的纵坐标为0,横坐标分别为x_1,x_2,\cdots,x_n。蜗牛想要从原点走到第n根竹竿的底部(x_n,0)。蜗牛在x轴上的移动速度是1单位每秒,在竹竿上向上爬的速度是0.7单位每秒,向下爬的速度是1.3单位每秒。此外,蜗牛可以在第i根竹竿的高度为a_i的位置(x_i,a_i)瞬间传送到第i + 1根竹竿的高度为b_{i+1}的位置(x_{i+1},b_{i+1})(0 < i < n)。
 
输入格式
 
1. 第一行是一个正整数n。
2. 第二行是n个正整数x_1,x_2,\cdots,x_n。
3. 后面n-1行,每行两个正整数a_i,b_{i+1}。
 
输出格式
 
输出一行,一个浮点数表示蜗牛到达目的地所需的最少时间(四舍五入保留两位小数)。
 
样例输入
 
plaintext
  
3
1 10 11
1 1
2 1
 
 

import java.util.Scanner;

public class SnailPath {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] x = new int[n];
        for (int i = 0; i < n; i++) {
            x[i] = scanner.nextInt();
        }
        int[][] ab = new int[n - 1][2];
        for (int i = 0; i < n - 1; i++) {
            ab[i][0] = scanner.nextInt();
            ab[i][1] = scanner.nextInt();
        }

        double minTime = Double.MAX_VALUE;
        for (int state = 0; state < (1 << (n - 1)); state++) {
            double time = 0;
            int pos = 0;
            int height = 0;
            for (int i = 0; i < n - 1; i++) {
                if ((state & (1 << i))!= 0) {
                    // 使用传送门
                    if (height!= 0) {
                        time += (double) height / 0.7;
                    }
                    time += 0;
                    height = ab[i][1];
                } else {
                    // 不使用传送门
                    if (height!= 0) {
                        time += (double) height / 0.7;
                    }
                    height = 0;
                    time += (double) (x[i + 1] - x[i]);
                }
            }
            if (height!= 0) {
                time += (double) height / 0.7;
            }
            time += (double) x[n - 1];
            if (time < minTime) {
                minTime = time;
            }
        }
        System.out.printf("%.2f", minTime);
    }
}


解题思路
 
1. 初始化:
- 首先读取输入的n,竹竿的横坐标数组x,以及每对传送门的高度a和b。
- 初始化一个变量 min_time 为一个较大的值,用于记录最小时间。
2. 计算时间:
- 对于每一种可能的路径,计算蜗牛从原点到达第n根竹竿底部所需的时间。
- 路径可以分为以下几种情况:
- 蜗牛一直沿着x轴爬行,不使用任何传送门。这种情况下,时间为x_n。
- 蜗牛使用部分传送门。在这种情况下,需要考虑每一种可能的传送门组合。
- 对于每一对相邻的竹竿i和i+1,计算以下两种情况的时间:
- 从x_i沿着x轴爬行到x_{i+1}的时间,即x_{i+1}-x_i。
- 从x_i处的高度a_i传送到x_{i+1}处的高度b_{i+1},然后计算在竹竿上移动的时间。在竹竿上向上爬的时间为a_i/0.7,向下爬的时间为b_{i+1}/1.3,传送时间为0(瞬间传送)。
- 选择时间最短的路径。
3. 更新最小时间:
- 对于每一种可能的路径,计算出时间后,更新 min_time 为较小的值。
4. 输出结果:
- 最后输出 min_time ,四舍五入保留两位小数。

还是不太理解o-0


http://www.kler.cn/a/449224.html

相关文章:

  • 蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)
  • 人工智能:人机交互和用户体验:相关学点、两者关系、未来趋势
  • GraalVM完全指南:云原生时代下使用GraalVM将Spring Boot 3应用转换为高效Linux可执行文件
  • OpenTK 中帧缓存的深度解析与应用实践
  • android studio更改应用图片,和应用名字。
  • spring学习(spring-DI(setter注入、构造器注入、自动装配方式))
  • R语言中vegan软件包使用教程
  • Zookeeper的选举机制
  • JVM对象分配内存如何保证线程安全?
  • leetcode 2295.替换数组中的元素
  • ElasticSearch 使用教程
  • 绿色环保木塑复合材料自动化生产线设计书
  • 【Maven】如何解决Maven循环依赖?
  • ECharts柱状图-柱图38,附视频讲解与代码下载
  • 01驱动钛丝(SMA)在汽车腰托支撑按摩气阀模块的应用
  • Ollama-OCR:利用视觉语言模型从图像中提取文本
  • 【网络云计算】2024第51周-每日【2024/12/19】小测-理论-如何实际一个校园网-简要列出
  • 内网IP段介绍与汇总
  • 分布式协同 - 分布式事务_TCC解决方案
  • NS3学习——队列管理机制
  • springboot中Jackson库和jsonpath库的区别和联系。
  • 时间复杂度和空间复杂度理解
  • AOP切点表达式之方法表达式execution
  • FreeSwitch中启用WebRTC
  • 软件测试经典面试题(答案解析+文档)
  • 最优二叉搜索树【东北大学oj数据结构10-4】C++