【寒假每日一题】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进行升序排列。


目录
相关文章
|
3月前
|
测试技术
AcWing 2867. 回文日期(每日一题)
AcWing 2867. 回文日期(每日一题)
|
7月前
|
机器学习/深度学习
【Acwing积累】第一周(完全数、只出现一次的字符)
【Acwing积累】第一周(完全数、只出现一次的字符)
|
8月前
|
算法 C++
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
【一刷《剑指Offer》】面试题 8:旋转数组的最小数字
|
8月前
蓝桥杯真题代码记录(数位排序
蓝桥杯真题代码记录(数位排序
56 0
|
8月前
|
算法
第十四届蓝桥杯集训——for——判断质数/素数
第十四届蓝桥杯集训——for——判断质数/素数
69 0
|
存储 算法 测试技术
【AcWing每日一题】4653. 数位排序
【AcWing每日一题】4653. 数位排序
126 0
数位排序-蓝桥杯-2022
利用HashMap该数据结构的特点,因为1到n不会有重复,而且把它做为键
|
人工智能 测试技术
【寒假每日一题】AcWing 4655. 重新排序(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 1、前缀和与差分 2、排序不等式
62 0
|
人工智能 算法 测试技术
【寒假每日一题】AcWing 4644. 求和(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
89 0
|
机器学习/深度学习 并行计算
【寒假每日一题】AcWing 4729. 解密(补)
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 韦达定理及其逆定理
87 0

热门文章

最新文章