主页 > 软件开发  > 

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

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硕(呆版)
标签:

2024蓝桥杯省赛真题-封闭图形个数由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“2024蓝桥杯省赛真题-封闭图形个数