蓝桥杯历届真题 # 封闭图形个数(C++,Java)

文章目录


题目解读

题目链接

[蓝桥杯 2024 省 C] 封闭图形个数

题目描述

在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的"封闭图形"的个数。

封闭图形是指数字中完全封闭的空间,例如数字 1 1 1、 2 2 2、 3 3 3、 5 5 5、 7 7 7 都没有形成封闭图形,而数字 0 0 0、 4 4 4、 6 6 6、 9 9 9 分别形成了 1 1 1 个封闭图形,数字 8 8 8 则形成了 2 2 2 个封闭图形。值得注意的是,封闭图形的个数是可以累加的。例如,对于数字 68 68 68,由于 6 6 6 形成了 1 1 1 个封闭图形,而 8 8 8 形成了 2 2 2 个,所以 68 68 68 形成的封闭图形的个数总共为 3 3 3。

在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。例如,数字 41 41 41 和数字 18 18 18,它们对应的封闭图形的个数分别为 1 1 1 和 2 2 2,因此数字 41 41 41 小于数组 18 18 18。如果两个数的封闭图形个数相同,那么数值较大的数更大。例如,数字 14 14 14 和数字 41 41 41,它们的封闭图形的个数都是 1 1 1,但 14 < 41 14 < 41 14<41,所以数字 14 14 14 小于数字 41 41 41。如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。

小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你 n n n 个数 a 1 , a 2 , ⋯   , a n a_1, a_2,\cdots, a_n a1,a2,⋯,an,请你按照蓝桥王国的数字大小规则,将这 n n n 数从小到大排序,并输出排序后结果。

输入格式

输入的第一行包含一个整数 n n n,表示给定的数字个数。

第二行包含 n n n 个整数 a 1 , a 2 , ⋯   , a n a_1, a_2,\cdots, a_n a1,a2,⋯,an,相邻整数之间使用一个空格分隔,表示待排序的数字。

输出格式

输出一行包含 n n n 个整数,相邻整数之间使用一个空格分隔,表示按照蓝桥王国的数字大小规则从小到大排序后的结果。

样例 #1

样例输入 #1

复制代码
3
18 29 6

样例输出 #1

复制代码
6 29 18

提示

【样例说明】

对于给定的数字序列 [ 18 , 29 , 6 ] [18, 29, 6] [18,29,6],数字 18 18 18 的封闭图形个数为 2 2 2,数字 29 29 29 的封闭图形个数为 1 1 1,数字 6 6 6 的封闭图形个数为 1 1 1。按照封闭图形个数从小到大排序后,得到 [ 29 , 6 , 18 ] [29, 6, 18] [29,6,18]。

由于数字 29 29 29 和数字 6 6 6 的封闭图形个数相同,因此需要进一步按照数值大小对它们进行排序,最终得到 [ 6 , 29 , 18 ] [6, 29, 18] [6,29,18]。

【评测用例规模与约定】

对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 2 × 1 0 3 1\le n \le 2 \times 10^3 1≤n≤2×103, 1 ≤ a i ≤ 1 0 5 1 \le a_i \le 10^5 1≤ai≤105。

对于所有评测用例, 1 ≤ n ≤ 2 × 1 0 5 1 \le n\le 2 \times 10^5 1≤n≤2×105, 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109。

思路

按照比较规则手写排序即可

完整代码

c++ 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N =2e5+10;

struct arr{
    int num;
    int cnt;
}arr[N];

int check(int n){
    int cnt=0;
    while(n){
        int temp=n%10;
        if(temp==0 || temp==4 || temp==6 || temp==9)cnt++;
        else if(temp==8)cnt+=2;
        n/=10;
    }
    return cnt;
}

bool cmp(struct arr x, struct arr y) {
    //如果cnt一样大,那么就比较num -- 升序排序
    if (x.cnt == y.cnt)return x.num < y.num;
    //否则优先比较 cnt的大小
    else return x.cnt < y.cnt;
}

int main(){
    int n;
    scanf("%d",&n);

    for(int i=0; i<n; i++){
        int num;
        scanf("%d",&num);
        //统计封闭图形个数
        int cnt=check(num);
        arr[i]={num,cnt};
    }

    sort(arr,arr+n,cmp);

    for(int i=0; i<n; i++)printf("%d ",arr[i].num);
}
java 复制代码
import java.util.*;


class Arr{
    int num;
    int cnt;

    Arr(int num, int cnt) {
        this.num = num;
        this.cnt = cnt;
    }

}

class Main{
    static Scanner sc =new Scanner(System.in);
    static final int N = 200010;
    static Arr[] arr = new Arr[N];
    public static void main(String args[]) {
        int n =sc.nextInt();
        for(int i=0; i<n; i++){
            int num=sc.nextInt();
            int cnt=check(num);
            arr[i]=new Arr(num,cnt);
        }
        Arrays.sort(arr,0,n,cmp);

        for(int i=0; i<n; i++){
            System.out.println(arr[i].num+" ");
        }
    }

    static int check(int n){
        int cnt=0;
        while(n>0){
            int temp=n%10;
            if(temp==0 || temp==4 || temp==6 || temp==9)cnt++;
            else if(temp==8)cnt+=2;
            n/=10;
        }
        return cnt;
    }

    static Comparator<Arr> cmp = new Comparator<Arr>() {
        @Override
        public int compare(Arr x,Arr y){
            if(x.cnt==y.cnt)return Integer.compare(x.num, y.num);
            else return Integer.compare(x.cnt, y.cnt);
        }
    };
}

🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻

🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹

😇 本篇文章可能存在多处不足,如有修改意见,可以私信或者评论我哦 😇


相关推荐
敖正炀1 分钟前
HashMap 源码深度拆解(JDK 7→8)
java
Yeats_Liao1 分钟前
物联网接入层技术剖析(二):epoll到底是怎么工作的
java·linux·网络·物联网·信息与通信
桀人9 分钟前
C++——内存管理——new和delete的超详细解析
开发语言·c++
Shadow(⊙o⊙)10 分钟前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
DevOpenClub10 分钟前
职教高考及高职分类招生控制线 API 接口
java·数据库·高考
Tsuki_tl12 分钟前
【总结】Java的线程状态
java·后端·面试·多线程·并发编程·线程状态
苦逼的猿宝18 分钟前
springboot的网页时装购物系统
java·毕业设计·springboot·计算机毕业设计
WL_Aurora18 分钟前
Java多线程编程基础与实践
java·多线程
_F_y19 分钟前
树形 DP 从入门到进阶:普通树形DP、树形背包、换根DP
c++·动态规划
再写一行代码就下班23 分钟前
根据给定word模板,动态填充指定内容,并输出为新的word文档。(${aa}占位符方式且支持循环动态表格)
java·开发语言