1. 题目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 131072 kB

1.2. Problem Description

身份证号是我国公民的唯一识别码,它由 18 18 18 位数字或者字母组成(只可能最后一位是字母)。 18 18 18 位身份证号码的含义如下:第 1 2 1\sim2 12 为省、自治区、直辖市代码:第 3 4 3\sim4 34 位为地级市、盟、自治州代码;第 5 6 5\sim6 56 位为县、县级市、区代码。第 7 14 7\sim14 714 位位出生年月日,比如 19970401 19970401 19970401 代表 1997 1997 1997 4 4 4 1 1 1 日;第 15 16 15\sim16 1516 位为顺序号,第 17 17 17 位代表性别,男为单数,女为双数,第 18 18 18 位为校验码, 0 9 0\sim9 09 X X X。作为尾号的校验码,是把前十七位数字代入统一的公式计算出来的。解答本题你不用关心是如何计算出来的。现在给你 n n n 个身份证号码,请你按照出生年月日的字典序(年龄从大到小)输出第 m m m 个人的身份证号。

一些解释:虽然造数据的人非常辛苦的制造各种各样的身份证号(并且让他们生日互不相同),但是你并不需要验证关于身份证号的任何合法性,包括省市区是否合法,出生年月日是否合法,校验值是否合法,你需要做的仅仅是输出年龄从大到小第 m m m 个人的身份证号。


1.3. Input

输入第一行包含两个正整数 n n n m m m,两数之间用一个空格分隔,接下来的 n n n 行每行为一个形如上述格式的身份证号码(不需要关心校验码的正确性,不影响本题解答)。 1 n 100 1 m n (1≤n≤100,1≤m≤n) 1n1001mn


1.4. Output

输出仅包含一行,为题目要求的一个身份证号码。


1.5. Sample Input

4 2
110108196004063022
13021119640203652X
420333197902112718
210222200012036512

1.6. Sample Output

13021119640203652X

1.7. Source

51Nod 2142 第m大的身份证号码


2. 解读

使用STL中的 sort 函数,自定义排序规则即可对身份证号码进行排序。

注:使用 atoi 函数可以将字符串转为数字

3. 代码

#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;

// 存储身份证号
string idStrList[100];

// 比较函数
bool cmp(const string& str1, const string& str2)
{
    // 出生日期转为int
    int buffer1 = atoi(str1.substr(6, 8).c_str());
    int buffer2 = atoi(str2.substr(6, 8).c_str());
    // 返回比较结果,年龄从大到小排序
    return buffer1 < buffer2;
}

int main()
{
    int n, m;
    // 读入n
    scanf("%d %d", &n, &m);
    // 读入身份证号
    for (int i = 0; i < n; i++) {
        // 获取内存空间
        idStrList[i].resize(18);
        // 读入身份证号
        cin >> idStrList[i];
    }
    // 排序
    sort(idStrList, idStrList + n, cmp);

    // 输出身份证号
    printf("%s\n", idStrList[m - 1].c_str());
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。