蓝桥杯刷题——day4

蓝桥杯刷题------day4

题目一

题干

小蓝和朋友们在玩一个报数游戏。由于今年是2024 年,他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是:20,24,40,48,60,72,80,96,100,120。请问第202420242024个被报出的数是多少?

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,填写多余的内容将无法得分。
题目链接: 报数游戏

题目解析

这道题目其实很简单,我们最先的想法是设立一个计数器,然后一个一个的遍历,只要满足数字整除20或者整除24,那么计数器就+1,但是这个方法会耗费很长的时间,我们可以将20×24看作一个轮回,先计算20到24之间的能整除20或者整除24的个数times,然后用202420242024除以times得到商和余数,商则表示经过了几个轮回,而余数则表示是这个轮回的第几个数字,那么将两者相加,就表示了第202420242024个数是什么了,问题解决,下面是完整的代码:

代码

java 复制代码
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        ArrayList<Long> list = new ArrayList<>();
        long times = 0;
        for (Long i = 1L; i <= 480; i++) {
            if (i % 20 == 0 || i % 24 == 0) {
                list.add(i);
                times++;
            }
        }
        Long a = 202420242024L;
        Long tmp1 = a / times;
        int tmp2 = (int) (a % times);
        System.out.println(list.get(tmp2 - 1) + 480L * tmp1);
    }
}

题目二

题干

给定一个数组,每次操作可以选择数组中任意两个相邻的元素x,y 并将其中的一个元素替换为gcd(x,y),其中gcd(x,y) 表示x 和y 的最大公约数。请问最少需要多少次操作才能让整个数组只含1。
输入:

输入的第一行包含一个整数n,表示数组长度。第二行包含n 个整数,相邻两个整数之间用一个空格分隔。
输出:

输出一行包含一个整数,表示最少操作次数。如果无论怎么操作都无法满足要求,输出-1。
示例一:

输入:

3

4 6 9

输出:

4

题目链接: 最大公约数

题目解析

这道题目关键是如何找出一个最小子串,该最小子串能够实现数组中的最大公约数为 1,什么意思?如果我们把一个子串中的一个元素变为了1,那么我们就可以根据这个1把数组的其他元素都变成1,什么意思?我们下面的图:

5和4的最大公倍数是1,那么我们就可以把其中的一个数字变成1,那么其他的也可以根据这个1变成1,就像病毒扩散一样,因此我们只需要找到一个数组里的最短子串,并且该最短子串能够实现最大公倍数为1就能够完成,因此我们完整的思路是:

  1. 计算整个数组的 GCD。如果 GCD 不为 1,直接输出 -1。
  2. 寻找最短的子数组,其 GCD 为 1,记为长度L。
  3. 最小操作次数为:n−1+(L−1),因为:n−1是将所有元素通过邻近操作将本身变为1的次数。(L−1)是在将子数组( GCD 为 1)其中一个元素变为1的操作次数。

下面是完整代码:

代码

java 复制代码
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        //输入数组的长度
        int n = scanner.nextInt();

        //输入数组的内容
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }

        System.out.println(minOperations(n, arr));
    }

    private static int minOperations(int n, int[] arr) {
        //判断整体的GCD
        int overallGCD = gcdArray(arr);
        if (overallGCD != 1) {
            return -1;// 如果整体GCD不是1,无论怎么操作都无法满足需求
        }

        //寻找最短子数组,其GCD为1
        int minLength = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            int currentGCD = arr[i];
            for (int j = i; j < n; j++) {
                currentGCD = gcd(currentGCD, arr[j]);
                if (currentGCD == 1) {
                    minLength = Math.min(minLength, j - i + 1);
                }
            }
        }

        //如果没有找到任何子数组GCD为1
        if (minLength == Integer.MAX_VALUE) {
            return -1;
        }
        return (n - 1) + (minLength - 1);
    }

    private static int gcdArray(int[] arr) {
        int result = arr[0];
        for (int i = 1; i < arr.length; i++) {
            result = gcd(result,arr[i]);
            if (result == 0){
                return 1;
            }
        }
        return result;
    }

    private static int gcd(int a, int b) {
        //计算两个数的GCD
        while (b != 0) {
            int tmp = b;
            b = a % b;
            a = tmp;
        }
        return a;
    }
}
相关推荐
武昌库里写JAVA41 分钟前
39.剖析无处不在的数据结构
java·vue.js·spring boot·课程设计·宠物管理
Nelson_hehe3 小时前
Java基础第四章、面向对象
java·语法基础·面向对象程序设计
Thomas_YXQ3 小时前
Unity3D Lua集成技术指南
java·开发语言·驱动开发·junit·全文检索·lua·unity3d
ShiinaMashirol4 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
东阳马生架构6 小时前
Nacos简介—3.Nacos的配置简介
java
北极的企鹅886 小时前
XML内容解析成实体类
xml·java·开发语言
梁下轻语的秋缘6 小时前
每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
c语言·c++·学习·蓝桥杯
oioihoii6 小时前
C++23 中 static_assert 和 if constexpr 的窄化布尔转换
java·jvm·c++23
聂 可 以6 小时前
调整IntelliJ IDEA当前文件所在目录(包路径)的显示位置
java·ide·intellij-idea
wuqingshun3141596 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯