当前位置: 首页 > news >正文

2024蓝桥杯省赛真题-封闭图形个数

在这里插入图片描述
拿到题目,咱们先来分析一手,上来就是封闭图形,那我们直接将这个封闭图形用一个数组记录下来,根据题目要求,我们得到了st数组

int st[10]={1,0,0,0,1,0,1,0,2,1};

这就是0-9数字的封闭的数字

然后下一段,分析一下,它们的封闭图形个数不同,那么封闭图形个数较多的数更大,反之就是值大的数大,如果值相同,就是相等的,就不用排序了

最终输出排序后的结果

现在我们来想,我们这个st数组只记录了一个数字的封闭值,让如果是两位数,三位数呢?
OK 啊,我们直接把他们拆开分别计算不就 好了嘛!!

说干就干,开搞,这道题的最大范围是 2e5 一定要看清楚题目的数据范围!!!!要不然不会 ac

是不是先是这样想的呀

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
using ll=long long;
int st[10]={1,0,0,0,1,0,1,0,2,1};
ll arr[N];
int main()
{
	ll n;cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>arr[i];
	}
	return 0;
}

那你就错了,劳弟,我们的封闭图形数,并没有和这个数字本身产生关联,那产生关联需要用什么呀?
结构体!!!!

所以我们定义一个结构体,来记录数字和数字的封闭数

struct num{
	int total;
	int val;	
}h[N];

这样定义就好啦,然后顺着上面的思路开始搞

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
using ll=long long;
int st[10]={1,0,0,0,1,0,1,0,2,1};
struct num{
	int total;
	int val;	
}h[N];
int main()
{
	ll n;cin>>n;
	for(ll i=0;i<n;i++)
	{
		cin>>h[i].val;
		ll sum=0;
		ll temp=h[i].val;
		while(temp>0)
		{
			sum+=st[temp%10];
			temp/=10;
		}
		h[i].total=sum;
	}
	for(ll i=0;i<n;i++)
	{
		cout<<h[i].val<<" "<<h[i].total<<" "<<'\n';
	}
	return 0;
}

运行一下康康
在这里插入图片描述
18有2个,29有1个,6有1个,OK t妥了,下面我们来进行这道题的核心!!!

排序!!!直接使用sort库函数就好啦!

根据题目来分析这个cmp函数该怎么写

排序规则:它们的封闭图形个数不同,那么封闭图形个数较多的数更大,反之就是值大的数大,如果值相同,就是相等的,就不用排序了

排序函数:

bool cmp(const num& a, const num& b)
{
    if (a.total == b.total) // 如果封闭数相等,执行里面的语句
    {
        if (a.val == b.val) // 如果值相等,返回 false,表示两个元素相等,不需要交换
        {
            return false;
        }
        else // 如果值不相等,返回 a.val < b.val,表示按值升序排列
        {
            return a.val < b.val;
        }
    }
    else // 如果封闭数不相等,返回 a.total < b.total,表示按封闭数升序排列
    {
        return a.total < b.total;
    }
}

注释说明:
封闭数相等的情况:

如果 a.total 和 b.total 相等,则进一步比较 a.val 和 b.val。

如果 a.val 和 b.val 也相等,则返回 false,表示两个元素相等,不需要交换。

如果 a.val 和 b.val 不相等,则返回 a.val < b.val,表示按 val 升序排列。

封闭数不相等的情况:

如果 a.total 和 b.total 不相等,则直接返回 a.total < b.total,表示按 total 升序排列。

最重要的完成了,最后输出一手就好了!

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
using ll=long long;
int st[10]={1,0,0,0,1,0,1,0,2,1};
struct num{
	int total;
	int val;	
}h[N];
bool cmp(const num& a,const num& b)
{
	if(a.total==b.total)
	{
		if(a.val==b.val)
		{
			return false;
		}
		else {
			return a.val<b.val;
		}
	}
	else
	{
		return a.total<b.total; 
	 } 
}
int main()
{
	ll n;cin>>n;
	for(ll i=0;i<n;i++)
	{
		cin>>h[i].val;
		ll sum=0;
		ll temp=h[i].val;
		while(temp>0)
		{
			sum+=st[temp%10];
			temp/=10;
		}
		h[i].total=sum;
	}
	sort(h,h+n,cmp);
	for(ll i=0;i<n;i++)
	{
		cout<<h[i].val<<" ";
	}
	return 0;
}

在这里插入图片描述

	------谨记-lou硕(呆版)

相关文章:

  • 蓝桥杯备考:从记忆化搜索到动态规划
  • 深入解析 Spring WebFlux:原理与应用
  • 链表OJ(十二)23. 合并 K 个升序链表 困难 优先级队列中存放指针结点
  • 什么是预训练语言模型下游任务?
  • 16.3 LangChain Runnable 协议精要:构建高效大模型应用的核心基石
  • LeetCode 27 移除元素
  • Linux(centOS) 命令提示符格式修改(PS1)
  • 数据结构(初阶)(七)----树和二叉树(堆,堆排序)
  • linux基础知识
  • RFID工具柜DW-G104R|智能存储,便捷高效
  • 解决git add . + git commit之后文件状态还是M 问题
  • java后端开发day25--阶段项目(二)
  • 《今日AI-编程-人工智能日报》
  • 130. 被围绕的区域(BFS)
  • 如何利用SpringSecurity进行认证与授权
  • 【数据结构】LRUCache|并查集
  • 计算机毕业设计SpringBoot+Vue.js健身房管理系统(源码+文档+PPT+讲解)
  • AbMole揭秘伤口愈合:IGF-1-SP1-CD248信号通路的新发现
  • Java并发编程之ConcurrentHashMap的原理和使用
  • Windows 11【1001问】查看Windows是否激活的11种方法
  • 我国成功发射中星3B卫星
  • 住建部:截至去年底常住人口城镇化率达到67%
  • 国家发改委:内卷式竞争扭曲市场机制、扰乱公平竞争秩序,必须整治
  • 讲述“外国货币上的中国故事”,《世界钱币上的中国印记》主题书刊出版发布
  • 外交部发言人就第78届世界卫生大会拒绝涉台提案发表谈话
  • 今晚油价下调,加满一箱油将省9元