IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2020第十一届蓝桥杯省赛C/C++真题——Java题解 -> 正文阅读

[C++知识库]2020第十一届蓝桥杯省赛C/C++真题——Java题解

目录

门牌制作

既约分数

蛇形填数:

七段码

跑步锻炼?

回文日期:

字串排序:?

成绩统计:

字串分值和:?

平面切分:?


门牌制作

题目描述
* 小蓝要为一条街的住户制作门牌号。
* 这条街一共有2020 位住户,门牌号从1 到2020 编号。
* 小蓝制作门牌的方法是先制作0 到9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017 需要依次粘贴字符1、0、1、7,即需要1 个字符0,2 个字符1,1 个字符7。
* 请问要制作所有的1 到2020 号门牌,总共需要多少个字符2?

本题是一道填空题,只需要将结果算出来就行。

思路:只需要枚举每个数的每一位是否等于2并计数就行了?

代码:

public class Main {

    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 2020; i++) {
            int k = i;
            while (k > 0) {
                int m = k % 10;
                k = k / 10;
                if (m == 2)
                    count++;
            }
        }
        System.out.println(count); // 624
    }
}

答案为:624

?

既约分数

题目描述:

如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。
* 例如 3/4, 5/2,1/8,7/1都是既约分数
* 请问,有多少个既约分数,分子和分母都是1 到2020 之间的整数(包括1和2020)?

本题为结果填空题,只需要计算出结果提交即可,结果为整数,提交时不能输出多余的内容.

思路:这道题考的是最大公约数问题,因为是填空题不需要担心超时,所以可以直接用两层循环暴力法解决

代码:

public class Main {

    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 2020; i++) {
            for (int j = 1; j <= 2020; j++) {
                if (LargestCommonDivisor(i, j) == 1) {
                    count++;
                }
            }
        }
        System.out.println(count); // 2481215
    }
    public static int LargestCommonDivisor(int num1, int num2){
        return num1 == 0 ? num2 : LargestCommonDivisor(num2%num1,num1);
    }

}

?答案为:2481215

蛇形填数:

题目描述:

* 如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
* 1 2 6 7 15
* 3 5 8 14
* 4 9 13
* 10 12
* 11
* 容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?

本题为结果填空题,只需要计算出结果提交即可,结果为整数,提交时不能输出多余的内容.

思路:这道题可以直接找规律算出

规律:一行一列:1

? ? ? ? ? ?二行二列:5 (1+1*4)

? ? ? ? ? ?三行三列:13? (5+2*4)? ?

? ? ? ? ? ?四行四列:25 (13+3*4)

容易看出第i行第i列的值等于第i-1行第i-1列的值+(i-1)*4,也就是a[i][i] = a[i-1][i-1] + (i-1)*4;

代码:

?

public class Main {

    public static void main(String[] args) {
        int count = 1;
        for (int i = 2; i <= 20; i++) {
            count += 4 * (i-1);
        }
        System.out.println(count); //761
    }

}

答案为:761

七段码

?

?思路: 可以用DFS搜索所有状态,判断每种状态可不可行。判断的方法是把每条灯管当作一个节点,编号,连边建图,对搜索出的亮灯方案使用并查集判断点亮的灯管是否在同一个集合(并查集)。

????????因为这是填空题,当然还有种办法,人工枚举。但是很容易漏掉,实在不会做可以用。

代码:


public class Main {

    static int MAXN = 8;
    static int n = 7;
    static int ans = 0;
    static int[] path = new int[MAXN];
    static int[][] graph = new int[MAXN][MAXN];//保存边之间的关系
    static int father[] = new int[MAXN]; //保存父结点
    static int[] height = new int[MAXN]; //保存树的高度

    public static void main(String[] args) {

        //表示边之间的关系,1表示直连,0反之,自己和自己为一个较大的数
        graph[1][2] = graph[2][1] = 1;
        graph[1][6] = graph[6][1] = 1;
        graph[2][7] = graph[7][2] = 1;
        graph[6][7] = graph[7][6] = 1;
        graph[7][3] = graph[3][7] = 1;
        graph[7][5] = graph[5][7] = 1;
        graph[2][3] = graph[3][2] = 1;
        graph[3][4] = graph[4][3] = 1;
        graph[4][5] = graph[5][4] = 1;
        graph[5][6] = graph[6][5] = 1;

        for (int i = 1; i <= n; i++) {
            dfs(0, 1, i);
        }
        System.out.println(ans);
    }
    //初始化
    private static void init(){
        for (int i = 1; i < MAXN; i++) {
            father[i] = i;
            height[i] = 0;
        }
    }

    //查找x的祖先结点
    private static int find(int x) {
        if (x != father[x])
            return father[x] = find(father[x]);
        return father[x];
    }

    //合并
    private static void union(int x,int y){
        x = find(x);
        y = find(y);
        if (height[x] == height[y]){
            height[x] = height[x] + 1; //合并,树的高度加1
            father[y] = x;
        } else if (height[x] > height[y]) {
            //将高度小的树合并到高度大的树上
            father[y] = x;
        }else {
            //将高度小的树合并到高度大的树上
            father[x] = y;
        }
    }

    private static void dfs(int u, int p, int m) {
        if (u == m) {
            //初始化操作
            init();
            //集合合并
            for (int i = 0; i < m; ++i) {
                for (int j = i + 1; j < m; ++j) {
                    //存在边相连
                    if (graph[path[i]][path[j]] == 1) {
                        //path[i] 和 path[j] 合并成一个集合  
                        union(path[i],path[j]);
                    }
                }
            }
            //查找最终是否为一个集合
            boolean flag = false;
            for (int i = 0; i < m - 1; ++i) {
                //不是同一个集合
                if (find(path[i]) != find(path[i + 1])) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                ++ans;
            }
            return;
        }

        for (int i = p; i <= n; ++i) {
            path[u] = i;
            dfs(u + 1, i + 1, m);
        }
    }

}

?答案为:80

跑步锻炼?

?

思路:日期问题,只需要注意判断闰年和平年就行了

代码:


public class Main {

    public static void main(String[] args) {
        int ants = 0; //记录结果
        int[] Month = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // 平年每个月的天数
        int year = 2000, month = 1, day = 1, weekday = 6;
        while (true) {
            //判断是否是星期一或者是每个月月初
            if (weekday == 1 || day == 1) {
                ants += 2;
            }else {
                ants += 1;
            }
            if (year == 2020 && month == 10 && day == 1) {
                //结束条件
                break;
            }
            day += 1;
            weekday = (weekday+1)%7;
            //判断是否为闰年并且是二月
            if (month == 2 && ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){
                if (day > Month[month]+1){
                    day = 1;
                    month += 1;
                }
            }else {
                if (day > Month[month]){
                    day = 1;
                    month += 1;
                }
            }
            if (month == 13){
                month = 1;
                year += 1;
            }
        }
        System.out.println(ants); // 8879
    }
}

?答案为:8879

回文日期:

题目描述:

????????2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年2 月2日。因为如果将这个日期按“yyyymmdd” 的格式写成一个8 位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到2 年之后就是下一个回文日期:20211202 即2021 年12 月2 日。
也有人表示20200202 并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100 年后就能遇到下一个ABABBABA 型的回文日期:21211212 即2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA 型的回文日期各是哪一天。

输入格式:

????????输入包含多组测试数据,第一行为正整数T。(T≤1000)
????????接下来T行,每行包含一个八位整数N,表示日期。
????????对于所有评测用例,10000101?≤?N?≤?89991231,保证N 是一个合法日期的8 位数表示。

输出格式:

????????对于每组测试数据输出两行,每行1 个八位数。
????????第一行表示下一个回文日期,第二行表示下一个ABABBABA 型的回文日期。

输入样例:

????????2
????????20200202
????????20211203

输出样例:

????????20211202
????????21211212
????????20300302
????????21211212

思路:需要先写一个方法,来判断八位数是否为合法的日期。判断日期是否合法的时候也需要注意判断是否为润年。满足该条件再判断是否为回文串和ABABBABA型串。判断ABABBABA串可以利用set集合去重,判断set.size()是否等于2.? ?

代码:


import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

    //保存润年和平年每个月的天数
    public static int run[][] = {{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n;
        n = scanner.nextInt();
        String[] strings = new String[n];
        for (int i = 0; i < n; i++) {
            strings[i] = scanner.next();
        }
        scanner.close();
        for (int i = 0; i < n; i++) {
            //查找第一个回文串
            int num1 = find1(strings[i]);
            System.out.println(num1);
            //查找第一个ABABBABA型的回文串
            int num2 = find2(num1);
            System.out.println(num2);
        }
    }

    public static int find1(String dateStr) {
        int i;
        int date = Integer.parseInt(dateStr);
        for (i = date + 1; i < 90900910; i++) {
            if (check1(i)) {
                break;
            }
        }
        return i;
    }

    //判断是否回文
    private static boolean check1(int i) {
        String str = String.valueOf(i);
        char[] s = str.toCharArray();
        for (int j = 0; j < 4; j++) {
            if (str.charAt(j) != str.charAt(7 - j)) {
                return false;
            }
        }
        //判断是否为合法日期
        if (legalDate(s))
            return true;
        return false;
    }

    public static int find2(int date) {
        int i;
        for (i = date; i < 90900910; i++) {
            if (check2(i)) {
                break;
            }
        }
        return i;
    }

    private static boolean check2(int date) {
        //利用set去重
        Set<String> set = new HashSet<>();
        String str = String.valueOf(date);
        char[] s = str.toCharArray();
        for (int j = 0; j < 8; j++) {
            set.add(String.valueOf(str.charAt(j)));
        }
        if (set.size() != 2) {
            return false;
        } else {
            //还要判断是否为ABABBABA
            if (( str.charAt(0) == str.charAt(1) || str.charAt(2) == str.charAt(3) || str.charAt(1) == str.charAt(2)
                    || str.charAt(5) == str.charAt(6) || str.charAt(6) == str.charAt(7) || str.charAt(4) == str.charAt(5) ) ) {
                return false;
            } else if (str.charAt(3) == str.charAt(4)){
                if (legalDate(s))
                    return true;
                else
                    return false;
            }else
                return false;
        }
    }

    //判断是否为合法日期
    public static boolean legalDate(char[] s){
        int y = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0');
        int m = (s[4] - '0') * 10 + (s[5] - '0');
        int d = (s[6] - '0') * 10 + (s[7] - '0');
        if (m > 12) return false;
        int f = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0) ? 0 : 1;
        if (d > run[f][m]) return false;
        return true;
    }
}

字串排序:?

题目描述:
* 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
* 在冒泡排序中,每次只能交换相邻的两个元素。
* 小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒   泡排序的总交换次数是最少的。
*
* 例如,对于字符串lan 排序,只需要1 次交换。对于字符串qiao 排序,总共需要4 次交换。
* 小蓝的幸运数字是V,他想找到一个只包含小写英文字母的字符串,对这个串中的字符进行冒泡排序,正好需要V 次交换。请帮助小蓝找一个这样的字符串。
* 如果可能找到多个,请告诉小蓝最短的那个。
* 如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
* 请注意字符串中可以包含相同的字符。
*
* 输入格式
* 输入第一行为T,表示存在T组测试数据。(T≤25)
* 对于每组测试数据,输入一行包含一个整数V,为小蓝的幸运数字。
* 对于所有评测用例,1 ≤ V ≤ 10000。
*
* 输出格式
* 每组测试数据,输出一个字符串,为所求的答案。
*
* 输入样例
* 2
* 4
* 100
*
* 输出样例
* bbaa
* jihgfeeddccbbaa

这道题没能看懂,给大家推荐一篇好的文章

蓝桥杯“字串排序“题解_Nervous_46216553的博客-CSDN博客_字串排序

成绩统计:

题目描述
* 小蓝给学生们组织了一场考试,卷面总分为100 分,每个学生的得分都是一个0 到100 的整数。
* 如果得分至少是60 分,则称为及格。如果得分至少为85 分,则称为优秀。
* 请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
*
* 输入格式
* 输入的第一行包含一个整数n,表示考试人数。
* 接下来n 行,每行包含一个0 至100 的整数,表示一个学生的得分。
*
* 输出格式
* 输出两行,每行一个百分数,分别表示及格率和优秀率。
* 百分号前的部分四舍五入保留整数。
*
* 输入样例
* 7
* 80
* 92
* 56
* 74
* 88
* 100
* 0
*
* 输出样例
* 71%
* 43%

这道题就很简单了,不需要说思路了,直接上代码

import java.util.*;

public class Main {

    public static void main(String[] args) {
        int n;
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
        }
        double youxiu = 0;
        double jige = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= 85){
                youxiu++;
            }
            if (arr[i] >= 60){
                jige++;
            }
        }
        System.out.printf("%.0f%s",jige*100/n,"%");
        System.out.println();
        System.out.printf("%.0f%s",youxiu*100/n,"%");
    }
}

?

字串分值和:?

题目描述
* 对于一个字符串S ,我们定义S 的分值f (S ) 为S 中出现的不同的字符个数。
* 例如f (”aba”) = 2, f (”abc”) = 3, f (”aaa”) = 1。
* 现在给定一个字符串S [0 : n - 1](长度为n),请你计算对于所有S 的非空子串S [i : j](0 ≤ i ≤ j < n), f (S [i:: j]) 的和是多少。
* <p>
* 输入格式
* 输入一行包含一个由小写字母组成的字符串S 。
* 对于所有评测用例,1 ≤ n ≤ 100000。
* <p>
* 输出格式
* 输出一个整数表示答案。
* <p>
* 输入样例
* ababc
* <p>
* 输出样例
* 28

?思路:可以直接用暴力法,利用Set去重的特性,可以得到一半的分数,后面的数据太大超时了

代码:


import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        String subStr = "";
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            for (int j = i+1; j <= str.length(); j++) {
                subStr = str.substring(i,j);
                count += totalCharCount(subStr);
            }
        }
        System.out.println(count);
    }

    //统计字符串中有多少个不同的字符
    public static int totalCharCount(String str){
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < str.length(); i++) {
			set.add(str.charAt(i));
        }
        return set.size();
    }
}

平面切分:?

* 题目描述
* 平面上有N 条直线,其中第i 条直线是y = Ai * x + Bi。
* 请计算这些直线将平面分成了几个部分。
* 
* 输入格式
* 第一行包含一个整数N。
* 以下N 行,每行包含两个整数Ai, Bi。
* 对于50% 的评测用例,1 ≤ N ≤ 4, -10 ≤ Ai, Bi ≤ 10。
* 对于所有评测用例,1 ≤ N ≤ 1000, -100000 ≤ Ai, Bi ≤ 100000。
* 
* 输出格式
* 一个整数代表答案。
* 
* 输入样例
* 3
* 1 1
* 2 2
* 3 3
* 输出样例
* 6

思路:

1、一条一条的把直线放到平面上。
2、每次放入一条直线,看看这条直线会与平面上已有的直线产生多少个不同的交点。假如会产生a个交点,那么可以知道,放入了这条直线后,部分平面的个数会增加a+1(需要注意的是有可能交点会重合,也可能加入的直线在平面中已经存在了)。
3、从第1条直线开始放置到平面上,直至放置第n条结束。将每次放入一条直线后部分平面个数增加的个数累加起来就是最终的答案。

代码(只能解决50%的数据):

import java.util.Arrays;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        int n;
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        Line[] lines = new Line[0];
        Line[] temp = new Line[0];
        int count = 0;//统计平面的个数
        int j = 0;
        for (int i = 0; i < n; i++) {
            lines = Arrays.copyOf(lines, i + 1);
            lines[i] = new Line(scanner.nextInt(), scanner.nextInt());
            temp = Arrays.copyOf(lines, lines.length-1);
            //如果存在该直线
            if (isSameLine(lines[i],temp)) {
                j--;
            }else {
                //*****新增一条直接之后,增加的平面个数 = 该直线与之前的直线相交的条数 + 1
                count += intersectionNum(lines[j], temp);
            }
            j++;
        }
        System.out.println(count);
    }

    /**
     * 判断该直线是否已经在数组中存在
     * @param line
     * @param lines
     * @return
     */
    public static boolean isSameLine(Line line,Line[] lines){

        for (int i = 0; i < lines.length; i++) {
            if (line.k == lines[i].k && line.b == lines[i].b){
                return true;
            }
        }
        return false;
    }

    /**
     * 功能:求出直线line与lines数组中的直线相交的条数
     *
     * @param line
     * @param lines
     * @return
     */
    public static int intersectionNum(Line line, Line[] lines) {
        //第一条直线,将平面分成两个
        if (lines.length == 0) {
            return 2;
        }
        int count = 0;
        int sum = 0;
        for (int i = 0; i < lines.length; i++) {
            //直线不平行,必相交
            if (line.k != lines[i].k) {
                count++;
            }
            if ((line.k * 1.0 / lines[i].k) == (line.b * 1.0 / lines[i].b)) {
                sum++;
            }
        }
        if (sum >= 2)
            return count;
        return count + 1;
    }
}

class Line {
    //斜率
    int k;
    //截距
    int b;

    public Line(int k, int b) {
        this.k = k;
        this.b = b;
    }

    public Line() {
    }
}

?


?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:22:12  更:2022-10-08 20:25:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:49:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码