2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

news2024/11/28 9:40:48

目录

第一题握手,这个直接从49累加到7即可,没啥难度,后面7个不握手就好了,没啥讲的,(然后第二个题填空好难,嘻嘻不会)

第三题.好数​编辑

第四题0R格式

宝石组合

数字接龙

最后一题:拔河


第一题握手,这个直接从49累加到7即可,没啥难度,后面7个不握手就好了,没啥讲的,(然后第二个题填空好难,嘻嘻不会)

第三题.好数

不是哥们,真比JAVA简单一倍啊,啥奇怪的东西,牛魔的奇数位偶数位都出来了。纯暴力不说了也。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
           Scanner in=new Scanner(System.in);
       int N=in.nextInt();
       int count=0;
       for(int i=1;i<=N;i++){
           int tmp=0;
           int k=1;
           int p=i;
          while(p!=0){
              //求出来个位
             int t=p%10;
             //个位
             if(t%2==0&&k%2!=0){
                 tmp=1;
                 break;
             }
             //十位,
           else  if(t%2!=0&&k%2==0){
                 tmp=1;
                 break;
             }
             k++;
             p=p/10;
          }

           if(tmp==1){
               continue;
           }else{
               count++;
           }
       }
        System.out.println(count);
    }
}

第四题R格式

开始的时候没想到用BigDecimal,寻思拿long就够,谁知道根本跑不出来,所以选择使用这个大数,大数的很多东西我都没用过,比如说什么xx次幂,还可以,四舍五入,完全没接触过,我第一次不知道有对应的方法,选择求出中间数,然后计算比如一个进行+1取舍,一个减一,然后两个/2就好

知道遇上了这个

BigDecimal.setScale()方法用于格式化小数点

BigDecimal.setScale(1)保留小数点后一位小数,四舍五入

setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4

setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5也向下舍

下面这个图是从这个地方摘的

import java.util.Scanner;
import java.math.BigDecimal;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
      public static void main(String[] args) {
            Scanner in=new Scanner(System.in);
            int n=in.nextInt();
            BigDecimal tmp=new BigDecimal("2");
            BigDecimal d=new BigDecimal(String.valueOf(in.nextBigDecimal()));
//tmp此时等于16,我们需要对数字进行操作
           tmp=tmp.pow(n);
        System.out.println(d.multiply(tmp).setScale(0,BigDecimal.ROUND_HALF_UP));

    }
}

宝石组合

数学知识:(最小公倍数)lcm(a,b)

最小公倍数:是能被A和B整除的最小正整数值

lcm(a,b)=a*b/gcd(a,b)

gcd两者之间的最大公约数

辗转相除法:a和b两者的最大公约数gcd(b,a%b)(b,a%b         记住顺口溜吧)

最大公约数,b逗a磨b

最小公倍数,相乘除公约(最大)

这个是我看到的题解,当然了,开始看公式谁来也会一脸懵,我们这样枚举一个数字

24 12 6 他们三个的最小公倍数 能被她们三个整除的最小正整数是24

这个是题解上看到的解释。

然后我们思考一下,gcd(a,b,c)最大公约数,是不是一定不会超过三者里面最大的那个。

因此我们直接枚举S,看abc啥的是否有符合的即可(最大公约数,这个数字可以整除这三个数字,那么我们是否可以思考一下,哪些数字可以整除最大s,假如不够3个,则往后走

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
  public static int S=100001;
    public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            int N=scan.nextInt();
            int[] a=new int[N];
            for(int i=0;i<N;i++){
                a[i]=scan.nextInt();
            }
//这里是个细节,你不写这一行,有一个用例过不去,我们使用的方法和C++大哥使用方法不一样,他是用S去找a[i],我是用a[i]找S.
//区别:用S找a[i],他会自动找到顺序,比如S=3,他会先3,6,9,12这样找a[i]有没有这个值
//我们是什么a[i]找S,换句话说a[i]%S假如等于0就说明可以被a[i]整除,
//那么这里来了一个问题,我们如何确保顺序性呢,比如14523,他们的可以确认顺序,因为是从1S,2S,3S这么过来的,那么我们找就可以选择使用一个排序,这样我们遍历使用就是字典序了,然后容器选啥都可以,Array,int[],我这个优先级队列(堆),因为排序做完了
             Arrays.sort(a);
            PriorityQueue <Integer>p=new PriorityQueue<>();
            while(S>=1) {
                int count = 0;
                for (int i = 0; i < N; i++) {
                    //思考清楚是谁除谁,最大公约数是x的话,是a[i]%x==0才叫x是a[i]的公约数。
                    if (a[i]%S == 0) {
                        p.add(a[i]);
                        count++;
                    }
                    if(count==3) break;;
                }
                if(count==3) break;;
                p.clear();
                S--;
            }

            while(!p.isEmpty()){
                System.out.print(p.poll()+" ");
            }

    }
    }

数字接龙

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
// 1:无需package
// 2: 类名必须Main, 不可修改
        static   int[]dx={-1,-1,0,1,1, 1, 0,-1};
        static   int[]dy={0,  1,1,1,0,-1,-1,-1};
        static Stack<Integer>q=new Stack<>();
        static boolean[][]vis;
        static  int N;
        static  int K;
        static int[][]a;
        static boolean[][][][]tail;
        //从[fx,fy]到[x,y]
        
        public  static  boolean four(int fx,int fy,int x,int y,int i){
            //这一步是判断他是否构成斜线,假如他是横线,或者竖直的我们不需要考虑
            if(i%2==1){
                //tail[x][fy][fx][y]==false&&tail[fx][y][x][fy]==false
                //   tail[fx][y][x][fy]==false&&tail[x][fy][fx][y]==false
                if(tail[x][fy][fx][y]==false&&tail[fx][y][x][fy]==false) {
                    return true;
                }
                else return false;
            }
            return true;
        }
        public  static  boolean check(int fx,int fy,int x,int y,int i){
            // (fy-y)/(fx-x)==1)&&x<fx
            //比较难处理的就是条件四
            if (x >= 0 && y >= 0 && x < N && y < N
                    //当前没有被遍历过
                    && vis[x][y] == false
                    && ((a[x][y]<K&&a[fx][fy] + 1 == a[x][y]) ||a[x][y] ==(a[fx][fy]+1)%K) &&
                    four(fx,fy,x,y,i)==true) {
                return true;
            }
            return false;
        }
        //表示起点
        public static boolean dfs(int a,int b){
            if(a==N-1&&b==N-1){
                return q.size()==N*N-1;
            }
            for(int i=0;i<8;i++){
                int x=a+dx[i];
                int y=b+dy[i];
                if(check(a,b,x,y,i)==true){
                    vis[x][y]=true;
                    tail[a][b][x][y]=true;
                    q.add(i);
                    if (dfs(x,y)==true) return true;
                    vis[x][y]=false;
                    tail[a][b][x][y]=false;
                    q.pop();
                }
            }
            return false;
        }
        public static void main(String[] args) {
            //这道题的思考,首先肯定不是bfs因为他没办法进行回溯,我牛魔不去回溯,我怎么知道那条路可以走到,所以需要回溯,使用dfs
            Scanner in=new Scanner(System.in);
            N=in.nextInt();
            K=in.nextInt();
            a=new int[N][N];
            //思维数组纯暴力破解
            tail=new boolean[N][N][N][N];
            for(int i=0;i<N;i++){
                for(int j=0;j<N;j++) {
                    a[i][j]=in.nextInt();
                }
            }
            vis=new boolean[N][N];
            vis[0][0]=true;
            if(dfs(0,0)==true){
               for(int i=0;i<q.size();i++){
                 //注意我开始写的时候,假如用栈的话,你不可以poll哦,因为假如说是poll就会后面的先出来,顺序
                   System.out.print(q.get(i));
               }
            }else {
                System.out.print(-1);
            }
}
}

最后一题:拔河

(说实话,真比JAVA最后一题简单一些,但是他也有难的地方,区间的一个排序很难,以及你暴力没办法解决)

纯暴力是肯定不能ac,估计也就通过6,7个例子,我们从暴力的过程中,学到优化才是核心目的。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        long []a=new long[n+1];
        for(int i=1;i<=n;i++){
            a[i]=in.nextLong();
        }
        long[][]dp=new long[n+1][n+1];
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                //从i位置到j,i到j-1然后+1
                dp[i][j]=dp[i][j-1]+a[j];
            }
        }
//最后我们思考,他的区间一定是连续,并且不重叠的
        for(int i=0;i<=n;i++) {
            dp[0][i]=dp[i][0]=0x3f3f3f3f3f3f3f3fL;
        }
        long min=0x3f3f3f3f3f3f3f3fL;
//换句话,正确的话,就是暴力枚举,一个枚举左边的左端点,另一个枚举右端点,再来一个枚举右边的左端点,来一个枚举右边的右端点
        //左端点从左侧,开始最后的n,但是细想一下,左端点是否可以等于n,答案应该是不可以的,左端点的右端点也不该到n,右端点的左端点肯定不可以和那个是左端点的右连起来
        for(int i=1;i<n;i++){
            for(int j=i;j<n;j++){
                for(int t=j+1;t<=n;t++) {
                    for (int k = t; k <= n; k++) {
                        min = Math.min(Math.abs(dp[i][j ] - dp[t][k]), min);
                    }
                }
            }
        }
        System.out.println(min);

    }
}

那么我们该如何优化呢?,

在这里引入数据结构

TheeSet:特点有序性,唯一性,插入删除查找都是O(logN)(内部是红黑)

first(返回数组中最小的元素)

last(返回数组中最大的元素)

higher(E e)返回集合中大于给定元素的最小元素

lower(E e):返回集合中严格小于给定元素的最大元素

ceiling(E e)返回集合中最小的大于或等于给定元素的元素

引入这个结构是为了让他有序,我们根据这个有序,随便来组合,不管他重复与否,全给他放入,

 Scanner scanner = new Scanner(System.in);
                int n = scanner.nextInt();
                long[] a = new long[n + 1];
                for (int i = 1; i <= n; i++) {
                    a[i] = scanner.nextInt();
                    a[i] += a[i - 1];
                }
                TreeSet<Long> s = new TreeSet<>();
                //初始化一个很大数字
                long ans = 1000000000L;
                for (int i = 1; i <= n; i++) {
                    for (int j = i; j <= n; j++) {
                        //从1开始不断因为我们前缀和,所以需要不断减去a[i-1]的值,从a[1]-a[0],a[2]-a[0]...a[2]-a[1]...,不断求出不同位置的前缀和
                        if (!s.contains(a[j] - a[i - 1])) {
                            //假如s里面之前已经有了这个值,就说明两个数字相同,直接返回0就行
                            s.add(a[j] - a[i - 1]);
                        } else {
                            System.out.println(0);
                            return;
                        }
                    }
                }
                //此时已经把所有的数组都处理好了,然后我们需要做
                for (int i = 1; i < n; i++) {
                    for (int j = 1; j <= i; j++) {
                        //t会走到所有的元素,假如TreeSet里面有(你要是说有最大的,最大的你想找较小的,
                        // 那么是否我们会找到较小的,然后找到最大的,所以不用去顾虑顺序啥的
                        long t = a[i] - a[j - 1];
                       // higher(E e)返回集合中大于给定元素的最小元素
                        //我在思考一个问题假如说     a b c x y z    假如说a+b和b+c他俩相差最小的情况呢,那么是否ac就可以,b不用管
                        //或者a b c   我们发现一个问题,假如出现重复的最小的情况,那么不需要重复的,换句话说 a+b 和b+c最小,其实不用看b,a和c最小
                        //我思考的是什么(如何保证两个前缀和,之间没有重复元素,假如有重复元素不就不可以了吗,但是实际上两个出现重复就不需要看重复
                        //这样一想,一切的2个连续子数组之和,求最小即可,有重复也可以(我重复的可以认为是把重复的去除)
                        Long p = s.higher(t);
                        if (p == null) {
                            //假如没有比他大的,那就去找first(返回数组中最小的元素)
//这里就是需要处理一下边界条件,但是假如是空,返回任意一个即可,无需说是一定就first
                            p = s.first();
                        }
                        //没有比他大的,然后用t这个值减去p这个值
                        ans = Math.min(ans, Math.abs(t - p));
                    }
                }
                System.out.println(ans);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django基础之路由

一.前言 前面我们说了django的安装于基础配置&#xff0c;基础知识点我就细分下来&#xff0c;每天和大家讲一点&#xff0c;今天就要和大家说django的基础知识点了&#xff0c;我们今天先来讲路由&#xff0c;内容不多&#xff0c;希望大家记住 二.传统路由 路由就是前面一个…

gitlab ssh-key 绑定

windows环境下配置 gitlab的ssh key&#xff1a; 1.打开本地git bash,使用如下命令生成ssh公钥和私钥对: ssh-keygen -t rsa -C xxxxxx.com 2.一直回车&#xff1b; 3.然后打开公钥文件&#xff1a;C:/Users/Administrator/.ssh/id_rsa.pub文件&#xff0c;复制其中的内容; 4…

26.100ASK_T113-PRO 测试摄像头 输出信息

1.测试代码 读到摄象头参数 输出 video_test.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <linux/type…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…

虚拟地址空间与物理内存(Linux系统)

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 问题引入 一、什么是虚拟内存 二、虚拟内存的描述与组织 三、页表的优势 四、虚拟内存区域划分 问题引入 为引入今天的话题&#xff0c;我们先来看下面…

docker-compose搭建xxl-job、mysql

docker-compose搭建xxl-job、mysql 1、搭建docker以及docker-compose2、下载xxl-job需要数据库脚本3、创建文件夹以及docker-compose文件4、坑来了5、正确配置6、验证-运行成功 1、搭建docker以及docker-compose 略 2、下载xxl-job需要数据库脚本 下载地址&#xff1a;https…

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另&#xff1a;Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影&#xff1a; 目标投影&#xff1a;与MODIS数据相同&#xff08;Sinu…

【模型学习之路】PyG的使用+基于点的任务

这一篇是关于PyG的基本使用 目录 前言 PyG的数据结构 演示 图的可视化 基于点的任务 任务分析 MLP GCN 前言 对图结构感兴趣的朋友可以学一下常用的有关图结构的库&#xff1a;networkx详细介绍 networkx 库&#xff0c;探讨它的基本功能、如何创建图、操作图以及其常…

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…

Edify 3D: Scalable High-Quality 3D Asset Generation

Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型&#xff1a; 4、数据处理模块&#xff1a; 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…

QUAD-MxFE平台

QUAD-MxFE平台 16Tx/16Rx直接L/S/C频段采样相控阵/雷达/电子战/卫星通信开发平台 概览 优势和特点 四通道MxFE数字化处理卡 使用MxFE的多通道、宽带系统开发平台 与Xilinx VCU118评估板&#xff08;不包括&#xff09;搭配使用 16个RF接收(Rx)通道&#xff08;32个数字Rx通道…

操作系统 锁——针对实习面试

目录 操作系统 锁什么是死锁&#xff1f;说说死锁产生的条件&#xff1f;死锁如何预防&#xff1f;死锁如何避免&#xff1f;银行家算法具体怎么操作&#xff1f;死锁如何解决&#xff1f;死锁会产生什么影响&#xff1f;乐观锁与悲观锁有什么区别&#xff1f; 操作系统 锁 什么…

UI设计-色彩、层级、字体、边距(一)

一.色彩&#xff1a;色彩可以影响人的心理与行动&#xff0c;具有不同的象征意义&#xff1b;有冷暖&#xff0c;轻重&#xff0c;软硬等等。 1.色彩情绪&#xff1a;最直观的视觉感受 一个活动的页面所用的颜色必须要与其内容相适应&#xff0c;让人看起来舒服。有时我们会不…

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…

【C++第三方库】Muduo库结合ProtoBuf库搭建服务端和客户端的过程和源码

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章我将结合之前的这俩个第三方库快速上手protobuf序列化和反序列化框架和muduo网络&#xff0c;来去实现muduo库在protocol协议搭建服务端和客户端。…

Scala—Map用法详解

Scala—Map用法详解 在 Scala 中&#xff0c;Map 是一种键值对的集合&#xff0c;其中每个键都是唯一的。Scala 提供了两种类型的 Map&#xff1a;不可变 Map 和可变 Map。 1. 不可变集合&#xff08;Map&#xff09; 不可变 Map 是默认的 Map 实现&#xff0c;位于 scala.co…

文本处理之sed

1、概述 sed是文本编辑器&#xff0c;作用是对文本的内容进行增删改查。 和vim不一样&#xff0c;sed是按行进行处理。 sed一次处理一行内容&#xff0c;处理完一行之后紧接着处理下一行&#xff0c;一直到文件的末尾 模式空间&#xff1a;临时储存&#xff0c;修改的结果临…

了解网络威胁情报:全面概述

网络威胁情报 CTI 是指系统地收集和分析与威胁相关的数据&#xff0c;以提供可操作的见解&#xff0c;从而增强组织的网络安全防御和决策过程。 在数字威胁不断演变的时代&#xff0c;了解网络威胁情报对于组织来说至关重要。复杂网络攻击的兴起凸显了制定强有力的策略以保护敏…

Python 海龟绘图 turtle 的介绍

python的计算生态中包含标准库和第三方库 标准库&#xff1a;随着解释器直接安装到操作系统中的功能模块 第三方库&#xff1a;需要经过安装才能使用的功能模块 库Library 包 Package 模块Module 统称为模块 turtle 是一个图形绘制的函数库&#xff0c;是标准库&#…