身份证排序
Description
安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位
Input
第一行一个整数n,表示有n个身份证号码
余下的n行,每行一个身份证号码。
Output
按出生日期从大到小排序后的身份证号,每行一条
Sample Input 1
5 466272307503271156 215856472207097978 234804580401078365 404475727700034980 710351408803093165
Sample Output 1
404475727700034980 234804580401078365 215856472207097978 710351408803093165 466272307503271156
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
n<=100000
思路做法:
开始我还以为要按照身份证格式一样弄,我就把出生日期的年份、月份、多少日给单独分出来做大小比较了。
就得到这样的“很满意”的结果:
#include <iostream>
using namespace std;
string a[100010];
int main(){
int n,s;
cin >> n;int x = n;
string s1;int b[n][3];
for(int i = 0;i < n;i++){
cin >> a[i];
}
for(int i = 0;i < n;i++){
b[i][0] = (a[i][6]-'0')*1000 + (a[i][7]-'0')*100 + (a[i][8]-'0')*10 + a[i][9]-'0'; //年
b[i][1] = (a[i][10]-'0')*10 + a[i][11]-'0'; //月
b[i][2] = (a[i][12]-'0')*10 + a[i][13]-'0'; //日
}
while(x-1 > 0){
for(int i = 0;i < n-1;i++){
if(b[i][0] > b[i+1][0]){
s = b[i+1][0];
b[i+1][0] = b[i][0];
b[i][0] = s;
s1 = a[i+1];
a[i+1] = a[i];
a[i] = s1;
}
if(b[i][0] == b[i+1][0]){
if(b[i][1] > b[i][1]){
s = b[i+1][1];
b[i+1][1] = b[i][1];
b[i][1] = s;
s1 = a[i+1];
a[i+1] = a[i];
a[i] = s1;
}
if(b[i][1] = b[i][1]){
if(b[i][2] > b[i][2]){
s = b[i+1][2];
b[i+1][2] = b[i][2];
b[i][2] = s;
s1 = a[i+1];
a[i+1] = a[i];
a[i] = s1;
}
}
}
}
x--;
}
for(int i = n-1;i >= 0;i--){
cout << a[i] << endl;
}
return 0;
}
结果发现题意是比较出生日期的大小,所以我完全想错了
最后代码如下:
#include <algorithm>
#include <iostream>
using namespace std;
int cmp(string a,string b){
string a1=a.substr(6,8);//截取某长度字符串
string b1=b.substr(6,8);
if(a1==b1)
return a>b;
else
return a1>b1;
}
int main(){
int n;
cin>>n;
string str[n];
for(int i=0;i<n;i++){
cin>>str[i];
}
sort(str,str+n,cmp);
for(int i=0;i<n;i++){
cout<<str[i]<<endl;
}
return 0;
}
sort(t+1,t+n+1,cmp)前两个参数指定了排序的序列,对first到last(不包括last)的元素进行排序,第三个参数指定了如何判断一个元素是否在另一个元素之前(可以理解为通常的小于关系)。对于你上边的调用,是对[t+1, t+n+1)中的元素(不包括t+n+1)进行排序,通过cmp判断一个元素是否小于另一个元素。