第十三届蓝桥杯省赛Java-B组

16 篇文章 0 订阅

第十三届蓝桥杯省赛Java-B组

第一次参加蓝桥杯比赛,准备工作就是学了一点算法知识,刷了一些洛谷上的题,往年蓝桥杯都是五道填空五道程序设计,今年又改了,居然两道填空八道程序设计,这样对于往常一些通过不编程就可以写的填空题似乎不是太友好啊,有几道题之前写过类似的题,做着很顺手,总结下来还是要多刷题,多总结题啊。

1️⃣星期计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjuawVpD-1649500917621)(D:\资源\学习工作\lnnau\typora笔记\笔记图片\image-20220409172403546.png)]

这道题本来我想通过用excal中的日期公式计算,可惜结果太大,只能作罢,编程的方式也不难,用大数计算一下结果,对7求余数,得到的结果原来的星期六即可。

答案:7

package top.plutos;

import java.math.BigDecimal;
public class t1 {
    public static void main(String[] args) {
        BigDecimal tp = new BigDecimal("20");
        tp = tp.pow(22).add(new BigDecimal("6"));
        System.out.println(tp);
        tp = tp.remainder(new BigDecimal("7"));
        System.out.println(tp); //0代表的是周日
    }
}

2️⃣山

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaDf3qNo-1649500891178)(D:\资源\学习工作\lnnau\typora笔记\笔记图片\image-20220409172922582.png)]

这道题就相当于回文数的特殊版吧,对于求回文数又加了一个限定的条件,就是要求前段回文单调不减(递增或者相等),后段单调不增,求回文数的方式我知道的有两只中,一种是对当前数进行做除法求余数,这种需要对不同长度的字符进行特判,第二种是用StringBuffer,判断字符反转后是否相等。

答案:63936

package top.plutos;
//51948 8000 43948  少了一种回文相等的情况
//54936 9000    63936
public class t2 {
    public static void main(String[] args) {
        int count = 0;  //1011111011
                        //2022222022
        for(int i=2020;i<=2022222022;i++) {
            StringBuffer sb = new StringBuffer();
            sb.append(i);
            String s = ""+i;	
            //判断回文和是否单调不减
            if(Integer.parseInt(s.substring(0,1))<=Integer.parseInt(s.substring(1,2)) && s.equals(sb.reverse().toString())) {
                count++;
            }
        }
        System.out.println(count);
    }
}

3️⃣字符统计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NievXYDu-1649500891178)(D:\资源\学习工作\lnnau\typora笔记\笔记图片\image-20220409174334791.png)]

处理字符串,首先想到用char来处理,这道题可以利用一个char数组存字符串,在通过每个字符独一无二的ASCII码的特点,用另外一个数组arr统计字符出现的次数,把出现次数最多的字符按照字典顺序输出即。

package top.plutos;

import java.util.Scanner;

public class t3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] ch = sc.nextLine().toCharArray();
        int[] arr = new int[128];
        for(int i=0;i<ch.length;i++) {
            arr[ch[i]]++;
        }
        int max = 0;
        StringBuffer sb = new StringBuffer();
        //得出出现最多次数的个数
        for(int i=0;i<arr.length;i++) {
            if(arr[i]>max) {
                max = arr[i];
            }
        }
        //把出现次数最多的字符按照字典顺序组合
        for(int i=65;i<128;i++) {
            if(arr[i]==max) {
                sb.append((char)i);
            }
        }
        System.out.println(sb);
    }
}

4️⃣最少刷题数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ohbemlh-1649500891179)(D:\资源\学习工作\lnnau\typora笔记\笔记图片\image-20220409175723876.png)]

某同学刷题数为i,要求刷题数大于i的学生人数小于等于刷题数小于i的同学数,先按照刷题数进行排序,这样就可以直接得到每个同学刷题数之间的关系,因为要求的是刷题数大于i的学生人数小于等于刷题数小于i的同学数,那么处于排序后半段的同学不需要处理,只需要处理前半段同学,对于前半段同学,需要让他自身的刷题数大于中间值的刷题数即可,因为是二维数组,就手写了一个冒泡排序,代码如下。

package top.plutos;

import java.util.Scanner;

public class t4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n][2];
        //第一列赋值
        for(int i=0;i<n;i++) {
            arr[i][0] = i;
        }
        //第二列赋值
        for(int i=0;i<n;i++) {
            arr[i][1] = sc.nextInt();
        }
        //按照值从小到大排序
        boolean flag =true;
        for(int i=0;i<n;i++) {
            flag=false;
            for(int j=0;j<n-i-1;j++) {
                if (arr[j][1]>arr[j+1][1]) {
                    int tp0 = arr[j][0];
                    int tp1 = arr[j][1];
                    arr[j][0]=arr[j+1][0];
                    arr[j][1]=arr[j+1][1];
                    arr[j+1][0]=tp0;
                    arr[j+1][1]=tp1;
                    flag=true;
                }
            }
        }
        int[] res = new int[n]; //保存每个同学需要再刷题的结果
        //遍历刷题数量
        int tp = n/2;
        for(int i=0;i<tp;i++) { //只需要遍历前半段
            int num = arr[tp][1]-arr[i][1]+1;   //求出该同学需要再刷多少题
            res[arr[i][0]] = num;
        }
        for(int i=0;i<n;i++) {
            System.out.print(res[i]+" ");
        }
    }
}

待更新

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值