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

news/2024/10/22 11:28:47/

目录

一、题目

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进行升序排列


http://www.ppmy.cn/news/10257.html

相关文章

app逆向 || xx合伙人登陆参数

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 本文适用于对安卓开发和Java有了解的同学 前言 本人最近一直在…

力扣(LeetCode)1658. 将 x 减到 0 的最小操作数(C++/Python)

题目描述 逆向思维滑动窗口 题目分析 &#xff1a; 从数组左侧和右侧&#xff0c;取出左侧的连续数字&#xff0c;右侧的连续数字&#xff0c;使得这些数字之和等于 x&#xff0c;维护最小取数次数&#xff0c;作为答案 。 设整个数组之和 total &#xff0c;除去左侧和右侧的…

定时器(Timer)

一、定时器是什么&#xff1f; 定时器类似于我们生活中的闹钟&#xff0c;可以设定一个时间来提醒我们。 而定时器是指定一个时间去执行一个任务&#xff0c;让程序去代替人工准时操作。 标准库中的定时器: Timer 方法作用void schedule(TimerTask task, long delay)指定dela…

python连接mysql之PyMySQL的基本使用

一、PyMySQL的基本使用使用pymysql 直接连接mysqlPyMySQL安装pip3 install pymysqlimport pymysql# 连接数据库&#xff0c;创建连接对象connection # 连接对象作用是&#xff1a;连接数据库、发送数据库信息、处理回滚操作&#xff08;查询中断时&#xff0c;数据库回到最初状…

隐形AR眼镜厂商Mojo Vision裁员75%,专注Micro LED技术

1月7日青亭网报道&#xff0c;隐形AR眼镜厂商Mojo Vision官方宣布了一项重大调整&#xff0c;其中因为产品进展问题&#xff0c;同时还有融资进展受阻等面临大裁员&#xff0c;将进行一系列中心调整&#xff0c;据了解本次裁员比例高达75%。重点关注&#xff1a;1&#xff0c;M…

TCP 慢启动突发丢包

TCP 慢启动会导致持续突发丢包。 慢启动以 y2xy2^xy2x 增加窗口&#xff0c;在 BDP 已经填满时&#xff0c;后续的慢启动过程如下&#xff1a; ​每一个 ACK 触发 2 个 报文&#xff0c;最终至少丢掉 1 个 BDP 的数据后 sender 才能检测到丢包而退出慢启动并进行重传。 这是…

【数据结构】完全二叉树——啊堆堆堆

一、树概念及结构树的概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n > 0&#xff09;个有限节点组成的一个具有层次关系的集合。把它叫做树是因为他看起来像是一颗倒挂起来的树&#xff0c;也就是说它是根朝上&#xff0c;而叶子朝下的。-> 有一个特殊的…

【机器学习】PR曲线F1评分ROC曲线AUC

参考&#xff1a;《百面机器学习》 PR曲线 TP&#xff08; True Positive&#xff09;&#xff1a;真正例 FP&#xff08; False Positive&#xff09;&#xff1a;假正例 FN&#xff08;False Negative&#xff09;&#xff1a;假反例 TN&#xff08;True Negative&#xff0…