终于自己写出来了一个题目,真的好开心呀
题目描述
在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。
封闭图形是指数字中完全封闭的空间,例如数字 1、2、3、5、7
都没有形成封闭图形,而数字 0、4、6、9
分别形成了 1
个封闭图形,数字 8
则形成了 2
个封闭图形。
值得注意的是,封闭图形的个数是可以累加的。
例如,对于数字 68
,由于 6
形成了 1
个封闭图形,而 8
形成了 2
个,所以 68
形成的封闭图形的个数总共为 3
。
在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。
例如,数字 41
和数字 18
,它们对应的封闭图形的个数分别为 1
和 2
,因此数字 41
小于数字 18
。
如果两个数的封闭图形个数相同,那么数值较大的数更大。
例如,数字 14
和数字 41
,它们的封闭图形的个数都是 1
,但 14<41
,所以数字 14
小于数字 41
。
如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。
小蓝对蓝桥王国的数字大小规则十分感兴趣。
现在,他将给定你 n
个数 a1,a2,…,an
,请你按照蓝桥王国的数字大小规则,将这 n
数从小到大排序,并输出排序后结果。
输入格式
第一行包含一个整数 n
,表示给定的数字个数。
第二行包含 n
个整数 a1,a2,…,an
,表示待排序的数字。
输出格式
输出一行,包含 n
个整数,表示按照蓝桥王国的数字大小规则从小到大排序后的结果,每两个数字之间用一个空格分隔。
样例
输入
3
18 29 6
输出
6 29 18
(暴力枚举)
C++ 代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2 * 1e5;
int a[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1}; // 权重数组
int n;
pair<int, int> p[N]; // 存储每个数字及其权重和
signed main()
{
cin >> n; // 输入数字的个数
for (int i = 0; i < n; i++)
{
cin >> p[i].first; // 输入每个数字
}
for (int i = 0; i < n; i++)
{
string s = to_string(p[i].first); // 将数字转换为字符串
int sum = 0;
for (int j = 0; j < s.size(); j++)
{
sum += a[s[j] - '0']; // 计算权重和
}
p[i].second = sum; // 存储权重和
}
// 按权重和排序,如果权重和相同,则按数字本身排序
sort(p, p + n, [](const pair<int, int> &a, const pair<int, int> &b)
{ return a.second == b.second ? a.first <b.first : a.second < b.second; });
// 输出结果
for (int i = 0; i < n; i++)
{
cout << p[i].first << " ";
}
return 0;
}