数位排序

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

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

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

TLE(通过了 5/10个数据)

快排+过程处理

点击查看代码
#include<iostream>
#include<algorithm>
using namespace std; int n,m;
const int N = 1e6 + 10;
int a[N]; int get(int x){
int ret = 0;
while(x){
ret += x % 10;
x /= 10;
}
return ret;
} bool cmp(int a,int b){
if(get(a) != get(b))return get(a) < get(b);
else return a < b;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++)a[i] = i;
sort(a + 1,a + n + 1,cmp);
cout << a[m];
//for(int i = 1; i <= n; i ++)cout << a[i] << " ";
}

TLE(通过了 7/10个数据)

冒泡加过程处理

点击查看代码
#include<iostream>
#include<algorithm>
using namespace std; int n,m;
const int N = 1e6 + 10;
int a[N]; int get(int x){
int ret = 0;
while(x){
ret += x % 10;
x /= 10;
}
return ret;
} bool cmp1(int a,int b){
if(get(a) != get(b))return get(a) > get(b);
else return a > b;
} bool cmp2(int a,int b){
if(get(a) != get(b))return get(a) < get(b);
else return a < b;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++)a[i] = i;
if(m > n - m){
for(int i = 1; i <= n - m + 1; i ++){
for(int j = 1; j < n - i + 1; j ++){
if(cmp1(a[j],a[j + 1]))swap(a[j],a[j + 1]);
}
}
cout << a[m];
}
else{
for(int i = 1; i <= m; i ++){
for(int j = 1; j < n - i + 1; j ++){
if(cmp2(a[j],a[j + 1]))swap(a[j],a[j + 1]);
}
}
cout << a[n - m + 1];
}
//or(int i = 1; i <= n; i ++)cout << a[i] << " ";
//cout << endl << a[m] << " " << a[n - m + 1];
}

Code(AC)\(O(nlogn)\)

快排+预处理 \(3489 ms\)

点击查看代码
#include<iostream>
#include<algorithm>
#include<vector>
#define X first
#define Y second using namespace std; typedef pair<int,int> PII;
int n,m;
const int N = 1e6 + 10;
vector<PII> q; int get(int x){
int ret = 0;
while(x){
ret += x % 10;
x /= 10;
}
return ret;
} bool cmp(PII a,PII b){
if(a.Y != b.Y)return a.Y < b.Y;
else return a.X < b.X;
} int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++)q.push_back({i,get(i)});
sort(q.begin(),q.end(),cmp);
cout << q[m - 1].first;
}

Code(AC) \(O(n)\)

快速选择\(287 ms\)

点击查看代码
#include <iostream>
#include <algorithm>
using namespace std; const int N = 1000010; int n, m;
int w[N], s[N]; bool cmp(int a, int b)
{
if (s[a] != s[b]) return s[a] < s[b];
return a < b;
} int quick_select(int l, int r, int k)
{
if (l == r) return w[l];
int x = w[l + r >> 1], i = l - 1, j = r + 1;
while (i < j)
{
do i ++ ; while (cmp(w[i], x));
do j -- ; while (cmp(x, w[j]));
if (i < j) swap(w[i], w[j]);
}
if (k <= j) return quick_select(l, j, k);
return quick_select(j + 1, r, k);
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ )
{
w[i] = i;
for (int j = i; j; j /= 10)
s[i] += j % 10;
}
printf("%d\n", quick_select(1, n, m));
return 0;
}

注意

  1. vector从0开始而不是1
  2. nlogn时间复杂度 -> 先对每个数进行预处理,保存数位和再进行排序,而不是排序过程中进行处理

数位排序【第十三届蓝桥杯省赛C++C组】的更多相关文章

  1. 纸张尺寸【第十三届蓝桥杯省赛C++C组】

    纸张尺寸 在 ISO 国际标准中定义了 \(A0\) 纸张的大小为 \(1189mm×841mm\),将 \(A0\) 纸沿长边对折后为 \(A1\) 纸,大小为 \(841mm×594mm\) ,在 ...

  2. 第十三届蓝桥杯省赛C/C++ B组

    @(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...

  3. 求和【第十三届蓝桥杯省赛C++A/C组 , 第十三届蓝桥杯省赛JAVAA组】

    求和 给定 \(n\) 个整数 \(a1,a2,⋅⋅⋅,an\),求它们两两相乘再相加的和,即 \(S=a1⋅a2+a1⋅a3+⋅⋅⋅+a1⋅an+a2⋅a3+⋅⋅⋅+an−2⋅an−1+an−2⋅a ...

  4. 四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】

    四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和. 如果把 0 包括进去,就正好可以表示为 4 个数的平方和. 比如: \(5=0^2+0^2+1^2+2 ...

  5. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

  6. 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版

    2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...

  7. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  8. 2016第七届蓝桥杯C/C++语言A组

    一:问题: 某君新认识一网友.当问及年龄时,他的网友说:“我的年龄是个2位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能情况? 提 ...

  9. 2019年第十届蓝桥杯省赛总结(JavaA组)

    //update3.28:省一rank4,莫名进了国赛好神奇.. 记yzm10第一次体验A组(纯粹瞎水). 早闻山东的JavaA组神仙打架,进国赛都成了奢望(往年只有五个名额),因此抱着做分母的心态来 ...

随机推荐

  1. 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

    前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...

  2. 二十三、Pod的service介绍

    Pod 的 Service 介绍 一.Service 介绍 Kubernetes Service 定义了这样一种抽象: 一个 Pod 的逻辑分组,一种可以访问它们的策略,通常称为微服务. 这一组 Po ...

  3. 创建base公共组件

    公共模块 基础模块参照了vant的思路,使用bem命名规范.先创建一个命名空间,这个命名空间返回创建组件函数与生成命名方法.在创建组件函数中创建name与install属性用于注册vue组件 创建组件 ...

  4. Rock18框架之整体框架介绍

    1. 总体框架图 2.框架能解决哪些问题? 问题1: 自动化设备包含龙门架.机械手.伺服.步进等电机.IO控制.定位及纠偏.界面展示等部分.其中硬件(伺服.IO等)是需要更换的,硬件的更换不影响整套系 ...

  5. Python基础之面向对象:1、面向对象及编程思想

    一.人狗大战 1.需求 用代码模拟人.狗打架的小游戏 人和狗种类不同,因此双方的属性各不相同 推导一: 人和狗各有不同属性 使用字典方式储存属性较为方便,并可储存多种属性 # 1.在字典内储存'人'属 ...

  6. 2022春每日一题:Day 33

    题目:[USACO 6.1.3] Cow XOR 没找到这题具体网址,这个题就是求最大异或区间(总长度尽量小,右端点尽量大) 嗯很显然一个[l,r]的异或和=s[r]s[l-1],那么现在有了优秀的n ...

  7. PHY驱动调试之 ---PHY设备驱动(三)

    1. 前言 内核版本:linux 4.9.225,以freescale为例.(部分内容待修改和补充,不一定准确) 2. 概述 上一篇文章讲了控制器的驱动使用的是platform总线的连接方式,本节要讲 ...

  8. css属性样式整合

    font-size 字体大小 常用色值:#000 黑色:#fff 白色:#ccc.#333.#2f2f2f.#666.#ddd 灰色: rgb表示法:color:rgb(255,255,255); r ...

  9. 【Devexpress】gridcontorl实现复制多个单元格

    1.设置复制的时候不复制标题在OptionsClipboard.CopyColumnHeaders=false 2.设置选择的方式为按照单元格选择,以及可以多选 OptionsSelection.Mu ...

  10. SSH(一)架包的引入

    一年多未使用了,有些东西真的会忘. 一.ssh的图形化记忆运作流程 二.Struts2.hibernate.spring需要引用的jar包 Struts2: 基本开发:struts-2.3.32\ap ...