【第十三届蓝桥杯C组/C++】4653.数位排序


📝我的个人主页
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️今天你做别人不想做的事,明天你就能做别人做不到的事♐


一、题目描述

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。

当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。

例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。

又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。

给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?

输入格式:
输入第一行包含一个正整数 n。

第二行包含一个正整数 m。

输出格式:
输出一行包含一个整数,表示答案。

输入样例:

13
5

输出样例:

3

样例解释:
1 到 13 的排序为:1,10,2,11,3,12,4,13,5,6,7,8,9。

第 5 个数为 3。

二、解题思路

因为每一个数有数位和与它自己的值两种属性。所以用结构体就非常方便。使用x存储它自身的值,使用y存储它的数位和。再编写一个cmp函数,最后排序即可。

二、AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{
    int x,y;
}a[N];
bool cmp(node a,node b)
{
    if(a.y!=b.y)return a.y<b.y;
    return a.x<b.x;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        a[i].x=i;
        int t=i;
        while(t){
            a[i].y+=t%10;
            t/=10;
        }
    }
    sort(a+1,a+1+n,cmp);
    cout<<a[m].x;
}

四、知识点总结

1、sort()的应用。它的前两个参数要是地址才行,我用a[1]、a[m]报错了。具体看下面这个链接,讲得是非常详细了。

C++ sort()排序详解

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 43
    评论
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值