【寒假每日一题】AcWing 4653. 数位排序(补)

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴关于pair

一、题目

1、原题链接

4653. 数位排序 - AcWing题库


2、题目描述

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


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


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


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


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


输入格式


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


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


输出格式


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


数据范围


对于 30% 的评测用例,1≤m≤n≤300。

对于 50% 的评测用例,1≤m≤n≤1000。

对于所有评测用例,1≤m≤n≤106。


输入样例:

13

5

输出样例:

3

样例解释

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

第 5 个数为 3。


二、解题报告

1、思路分析

1)创建一个每个元素都是pair类型的数组,其中每个元素记录当前元素的值和当前元素的数位和。


2)根据每个元素的数位和对数组进行排序。


3)输出第m个元素即为所求。


2、时间复杂度

时间复杂度O(n)


3、代码详解

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int ssum(int num){

int sum=0;

while(num){

 sum+=num%10;

 num/=10;

}

return sum;

}

bool cmp(pair<long long,int> A,pair<long long,int> B){

if(A.second==B.second)

   return A.first<B.first;

return A.second<B.second;

}

int main()

{   long long n,m;

   cin>>n>>m;

   vector<pair<long long,int>> v(n);

   for(int i=1;i<=n;i++){

    v[i-1].first=i;

    v[i-1].second=ssum(i);

}

sort(v.begin(),v.end(),cmp);

cout<<v[m-1].first;

return 0;

}

注:根据sort对pair的默认排序规则,可以简化代码:将每个pair的first存当前元素数位和,second存当前元素的值。这样可以将排序规则省掉,简化代码如下:


#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int ssum(int num){

int sum=0;

while(num){

 sum+=num%10;

 num/=10;

}

return sum;

}

int main()

{   long long n,m;

   cin>>n>>m;

   vector<pair<long long,int>> v(n);

   for(int i=1;i<=n;i++){

    v[i-1].first=ssum(i);

    v[i-1].second=i;

}

sort(v.begin(),v.end());

cout<<v[m-1].second;

return 0;

}


三、知识风暴

关于pair

1)如果想要创建一个每个元素都为pair类型的数组,可以使用vector<pair<string,int>>,vector嵌套pair来实现。

2)sort()对pair的排序:默认对first进行升序排列,如果first相同,对second进行升序排列。


目录
相关文章
|
11月前
|
NoSQL Java Redis
Redlock分布式锁高并发下有什么问题
Redlock分布式锁在高并发场景下可能面临的问题主要包括:网络延迟、时钟偏移、单点故障、宕机重启问题、脑裂问题以及效率低等。接下来,我将使用Java代码示例来说明其中一些问题。
314 12
|
10月前
|
安全 算法 网络协议
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字时代,网络安全和信息安全已经成为了我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,帮助读者更好地了解网络安全的重要性和应对措施。通过阅读本文,您将了解到网络安全的基本概念、常见的网络安全漏洞、加密技术的原理和应用以及如何提高个人和组织的网络安全意识。
|
10月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
246 14
|
人工智能 搜索推荐 机器人
人工智能在电商领域还有哪些应用场景
人工智能在电商领域还有哪些应用场景
557 0
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习在金融技术中的应用
本文将深入探讨机器学习技术在金融技术领域中的创新应用,并分析其在风险管理、算法交易和客户服务优化等方面的实际效果。文章将结合最新的行业数据和案例研究,展示机器学习如何推动金融服务的智能化转型,同时讨论实施过程中的挑战与未来发展趋势。通过本文,读者将获得对金融领域中机器学习应用的全面了解,包括其潜在价值及面临的主要问题。
196 0
Java 实现 Elasticsearch 查询全部数据
【7月更文挑战第7天】Java 实现 Elasticsearch 查询全部数据
|
Linux C++ iOS开发
VLC源码解析:视频播放速度控制背后的技术
VLC源码解析:视频播放速度控制背后的技术
1058 0
|
人工智能 移动开发 iOS开发
mac机上支持rar和unrar安装和使用
下载安装包 http://www.rarsoft.com/download.htm 选择Mac OS X版本,下载后是tar后缀的压缩文件 安装rar和unrar sudo ins...
1809 0
|
机器学习/深度学习 数据采集
区间预测 | MATLAB实现基于QRCNN-LSTM卷积长短期记忆神经网络多变量时间序列区间预测
区间预测 | MATLAB实现基于QRCNN-LSTM卷积长短期记忆神经网络多变量时间序列区间预测
|
消息中间件 存储 Go
Golang微服务框架Kratos应用NSQ消息队列
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。 NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。 NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。
232 1