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

蓝桥杯刷题——day8

蓝桥杯刷题——day8

  • 题目一
    • 题干
    • 解题思路
    • 代码
  • 题目二
    • 题干
    • 解题思路
    • 代码

题目一

题干

N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di个单位时间,即它最早可以于 Ti时刻开始降落,最晩可以于 Ti+Di时刻开始降落。降落过程需要 Li个单位时间。一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。请你判断N架飞机是否可以全部安全降落。
输入: 包含多组数据。第一行包含一个整数T,代表测试数据的组数。对于每组数据,第一行包含一个整数N。以下N行,每行包含三个整数Ti,Di,Li。
输出: 对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。
示例一:

输入:
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
输出:
YES
NO

题目链接: 飞机降落

解题思路

这条题目我并没有完全通过,所以我只是将我的思路说一下,如果发现问题欢迎私信或者评论。首先我们创建一个新的类Plane,这个类记录了飞机到达时间T,飞机最多可以盘旋的时间D,以及飞机降落所需的时间T,然后创建一个ArrayList,用ArrayList依次接受我们输入的Plane,然后将ArrayList进行排序,排序的准则是先处理最“紧急”的飞机,即最晚开始降落时间 T + D 较早的飞机,能尽量确保这些紧急飞机降落成功。然后创建一个变量:currentTime,这个变量表示:记录跑道的当前空闲时间,也就是当前跑道可以开始接纳下一架飞机的时间。然后依次将排序好的Plane的T和currentTime进行对比,如果跑道空闲时间(currentTime)早于飞机的到达时间(T),说明跑道已经空闲,但这架飞机还没有到达。在这种情况下,跑道必须等待飞机到达,因此需要将currentTime更新为飞机的到达时间 plane.T,如果跑道空闲时间大于等于飞机的到达时间,说明跑道空闲时间和飞机到达时间之间没有冲突。此时,跑道可以直接安排飞机降落。这时候我们要判断跑道的当前空闲时间是否超过飞机允许的最晚降落时间,如果超过则返回false,然后更新currentTime:currentTime = plane.L + currentTime ,如果遍历完整个链表后,都没有返回false,那么返回true。下面是完整代码:

代码

import java.util.ArrayList;
import java.util.Scanner;

class Plane {
    int T; // 飞机到达时间
    int D; // 飞机最多可以盘旋的时间
    int L; // 飞机降落所需的时间

    public Plane(int t, int d, int l) {
        T = t;
        D = d;
        L = l;
    }
}

public class Main {
    public static boolean Plane_isLanding(ArrayList<Plane> list) {
        int size = list.size();
        int currentTime = 0; // 跑道当前的空闲时间

        list.sort((a, b) -> (a.T + a.D) - (b.T + b.D)); // 按照飞机最晚降落开始时间排序

        for (Plane plane : list) {
            if (currentTime < plane.T) {
                currentTime = plane.T; // 如果跑道空闲时间早于飞机到达时间,更新为飞机到达时间
            }

            if (currentTime > plane.T + plane.D) {
                return false; // 如果当前时间超过飞机允许的最晚降落时间,返回 false
            }

            currentTime += plane.L; // 更新跑道空闲时间,表示当前飞机完成降落后跑道的空闲时间
        }

        return true; // 所有飞机都可以安全降落,返回 true
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取测试数据组数
        while (n > 0) {
            ArrayList<Plane> list = new ArrayList<>();
            int num = scanner.nextInt(); // 每组数据中的飞机数量
            while (num > 0) {
                int t = scanner.nextInt(); // 飞机到达时间
                int d = scanner.nextInt(); // 飞机盘旋的最大时间
                int l = scanner.nextInt(); // 飞机降落所需时间
                list.add(new Plane(t, d, l)); // 添加飞机信息到列表
                num--;
            }

            if (Plane_isLanding(list)) {
                System.out.println("YES"); // 如果所有飞机可以安全降落,输出 "YES"
            } else {
                System.out.println("NO"); // 如果无法满足条件,输出 "NO"
            }

            n--;
        }
        scanner.close(); // 关闭输入流
    }
}

题目二

题干

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。
输入: 给定一个正整数N,请计算从1到N一共有多少个好数。
输出: 一个整数代表答案。
示例一:

输入:
24
输出:
7
解释:
24 以内的好数有 1,3,5,7,9,21,23,一共7个。

示例二:

输入:
2024
输出:
150

题目链接: 好数

解题思路

这条题目相对来说比较简单,用动态规划就可以轻易解决了,我们定义数组dp[i]表示在1到i一共有dp[i]个好数,那么dp[i+1]就可以表示成:
在这里插入图片描述
那么问题又变成了如何判断一个数是否是好数,题目说从低位到高位的顺序,奇数位上的数字是奇数,偶数位上的数字是偶数,那么我们可以设置一个布尔类型的flag,这个flag用于判断此位置是奇数位还是偶数位(不是判断奇偶数哟,例:个位是奇数位,十位是偶数位),同时在将该位置上的数字拿到(对10进行取余就可以了),然后判断该位置是否满足”好数“的标准就可以了,下面是完整代码:

代码

import java.util.Scanner;
public class Main {
    public static boolean is_good_number(int i) {
        boolean flag = true;
        while (i > 0) {
            int remaining = i % 10;
            if (flag && (remaining % 2 != 0)){
                flag = false;
            } else if (!flag &&(remaining % 2 == 0)){
                flag = true;
            }else {
                break;
            }
            i = i/10;
        }
        return i == 0;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int[] dp = new int[num + 1];
        dp[1] = 1;
        for (int i = 2; i <= num; i++) {
            if (is_good_number(i)){
                dp[i] = dp[i - 1] + 1;
            }else {
                dp[i] = dp[i-1];
            }
        }
        System.out.println(dp[num]);
    }
}

如果这篇博客对你有帮助,别忘了点赞+收藏哦,如果有任何的问题或者意见,欢迎评论和私信,谢谢各位!


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

相关文章:

  • Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之4(百度文库答问 之2)
  • 手机便签哪个好用?手机桌面便签app下载推荐
  • Elasticsearch 集群快照的定期备份设置指南
  • Hexo Next主题本地搜索功能不可用问题解决
  • Python字典使用练习-----实现查找电话号
  • [RocketMQ] 发送重试机制与消费重试机制~
  • JDK21执行java -jar xxx.jar 文件时 “An unexpected error occurred” 问题处理
  • uniapp 自定义图标03
  • vscode容器调试使用-1.调试使用深入
  • VSCode:Remote-SSH插件安装使用 -- 在VSCode中使用SSH
  • Gin-vue-admin(4):项目创建前端一级页面和二级页面
  • Git 实用命令总结指南
  • 如何在 Debian 12 上安装 Chef Infra Server 自动化运维工具
  • springboot检测配置是否存在,如果存在则返回,不存在则提示新增
  • 网站安全监测存在的挑战,以及应对方案
  • java线程共享模型之管程(synchronized原理、wait-notify、park方法)
  • 【波数】常见波数计算公式及分析
  • 防火墙(RHCE)
  • RNN LSTM Seq2Seq Attention
  • VR展厅模板在各种平台上运行效果如何?
  • HTTP—02
  • 如何在Anaconda的虚拟环境中下载Python包
  • 学习记录:electron主进程与渲染进程直接的通信示例【开箱即用】
  • 类似于GitHub的平台
  • 【C语言】特殊指针汇总