4653. 数位排序(快速选择)(nth_element)
创始人
2024-05-08 14:56:13
0

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

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

例如,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。

  • 快速排序O(nlogn)O(nlogn)O(nlogn)
  • 注意要先预处理数位和,不要在cmp中处理,否则会tle
  • w[i]表示i的数位和
#include 
#include 
using namespace std;
const int N = 1e6 + 10;int n, m;
int a[N], w[N];int main() {cin >> n >> m;for (int i = 1; i <= n; ++ i) {a[i] = i;for (int j = i; j; j /= 10) {w[i] += j % 10;}}sort(a + 1, a + n + 1, [&](int u, int v) {if (w[u] != w[v]) return w[u] < w[v];return u < v;});cout << a[m];
}
  • 快速选择O(n)O(n)O(n)
  • 相比于sort,就是将sort换成了nth_element和在a + 1和a + n + 1之间加了a + m
#include 
#include 
using namespace std;
const int N = 1e6 + 10;int n, m;
int a[N], w[N];int main() {cin >> n >> m;for (int i = 1; i <= n; ++ i) {a[i] = i;for (int j = i; j; j /= 10) {w[i] += j % 10;}}nth_element(a + 1, a + m, a + n + 1, [&](int u, int v) {if (w[u] != w[v]) return w[u] < w[v];return u < v;});cout << a[m];
}
  • 手写快速选择算法O(n)O(n)O(n)
#include 
#include 
using namespace std;
const int N = 1e6 + 10;int n, m;
int a[N], w[N];int cmp(int u, int v) {if (w[u] != w[v]) return w[u] < w[v];return u < v;
}
int quick_select(int l, int r, int k) {if (l == r) return a[l];int x = a[l + r >> 1], i = l - 1, j = r + 1;while (i < j) {do i ++ ; while (cmp(a[i], x));do j -- ; while (cmp(x, a[j]));if (i < j) swap(a[i], a[j]);}if (k <= j) return quick_select(l, j, k);return quick_select(j + 1, r, k);
}int main() {cin >> n >> m;for (int i = 1; i <= n; ++ i) {a[i] = i;for (int j = i; j; j /= 10) {w[i] += j % 10;}}cout << quick_select(1, n, m);
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...