每日一题(4)

server/2024/12/24 21:21:08/

有一只蜗牛位于二维坐标系的原点(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.ppmy.cn/server/152869.html

相关文章

leetcode----mysql

1251. 平均售价 - 力扣&#xff08;LeetCode&#xff09; 表&#xff1a;Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price |…

LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)

一、引言 1.1 医疗数据挖掘的重要性与挑战 在当今数字化医疗时代,医疗数据呈爆炸式增长,这些数据蕴含着丰富的信息,对医疗决策具有极为重要的意义。通过对医疗数据的深入挖掘,可以发现潜在的疾病模式、治疗效果关联以及患者的健康风险因素,从而为精准医疗、个性化治疗方…

python+opencv+棋盘格实现相机标定及相对位姿估计

pythonopencv棋盘格实现相机标定及相对位姿估计 引言1&#xff0c;使用相机采集含棋盘格图像14张2&#xff0c;进行相机标定&#xff08;1&#xff09;测试软件1标定结果&#xff08;内参及畸变系数&#xff09;&#xff08;2&#xff09;测试软件2标定结果&#xff08;内参及畸…

Android Framework 中的 AV/Camera 技术架构详解

Android Framework 中的 AV/Camera 技术架构详解 引言 Android 操作系统作为全球最流行的移动操作系统之一,其强大的多媒体处理能力是其成功的关键因素之一。其中,摄像头(Camera)模块是 Android 系统中最为核心的部分之一,负责处理图像和视频的捕获、处理和传输。本文将…

typora数学符号

typora数学符号 Typora 是一个支持 LaTeX 数学公式的优秀 Markdown 编辑器&#xff0c;可以直接编写数学公式并实时渲染。以下是如何在 Typora 中使用数学公式的详细指南&#xff1a; 1. 启用数学公式支持 默认情况下&#xff0c;Typora 支持 LaTeX 格式的数学公式&#xff0…

Python 练习

一、列表练习 1、求偶数元素的和[1,2,1,2,3,3,6,5,8] 1 2 3 4 5 6 list01 [1, 2, 1, 2, 3, 3, 6, 5, 8] sum 0 for i in list01: if int(i) % 2 0: sum sum i print(f"列表中所有偶数和是: {sum}") 2、计算 1 - 2 3 - 4 ... 99 中除88以外…

ElasticSearch 使用教程

ElasticSearch 使用教程 1. ElasticSearch简介 ElasticSearch是一个基于Lucene的搜索服务器&#xff0c;提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。它是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流…

Spring Boot 启动后的初始化数据加载原理解析与实战应用

系统初始化操作是一个非常常见的需求。通常&#xff0c;应用在启动后需要执行一些重要的初始化任务&#xff0c;例如加载全局配置、初始化数据库表、预热缓存、启动后台任务等。而如何选择合适的技术方案&#xff0c;在不同的场景下保证初始化任务的高效执行&#xff0c;尤其在…