题目描述
由于环境破坏,导致了鱼大大家的环境不再适合居住。鱼大大家族需要举族迁徙。为了路途上的安全,鱼大大需要合理地将族人排队迁徙。鱼大大要求所有家族成员报上身份信息号码。以此提取有效信息进行排队。鱼大大家族的身份信息号码是18位身份证号码+2~7位能力数值组成的长度为20 ~ 25的纯数字串。
其中的数字含义如下:
前6位为该鱼出生所在的区域。
第7位~第10位为该鱼出生年份。
第11位~第14位为该鱼出生日期。
第15位~第16位为该鱼出生编号。
第17位为该鱼的性别。(奇数为男,偶数为女)
第18位为该鱼身份证号码的识别信息。
第19位到末尾的数字为该鱼的能力数值。
经过深思熟虑后,鱼大大认为在他的带领下,按以下的排队顺序迁徙是最安全的。
1、小孩子安排在队伍的最前面,其中年龄越小越靠前。
2、老年鱼紧跟其后排在中间,其中年龄越大越靠前。
3、成年鱼则在最后,根据女士优先原则,让所有女性排在男性前面,其中年龄越小的女性越靠前,而男性则是根据其能力先后排队,能力越大则越靠后。(其中年龄只按年份计算,当前年份(2000) - 出生年份即为年龄,小于100为小孩子,大于1000为老年鱼,其余为成年。若是小孩子、老年鱼、成年女性年龄相等,就按报到顺序先后排队,若是成年男性能力相等,则按报到顺序先后排队)
现在请你帮忙一起安排队伍的先后顺序,并将排好的队伍输出。
输入格式
第一行一个整数n,表示为鱼大大家族的成员人数接下来n行,每行两个字符串,分别表示该成员的姓名(长度不超过20),和该成员的身份信息号码(长度不超过25)。
输出格式
n行,每行一个字符串,分别为排好队的每位成员姓名
样例
Input 1
8
hong 29534619900123913540
ming 83982410631204861785
huan 33100305430101003403
feng 33100312340101003403
shyg 93420319501231380867
lbao 32687800510512982085
FijK 32687111111111982085
CSRO 84758117870908934072
Output 1
hong
shyg
lbao
huan
CSRO
FijK
feng
ming
样例解释
其中hong和shyg为小孩,按年龄排序,分别为10岁和50岁,顺序为hong、shyg。再是lbao和huan为老年,按年龄排序,分别为1949岁和1457岁,顺序为lbao、huan。其余为成年,先按性别排序,其中女性按年龄排序,顺序为CSRO213岁,FijK889岁。再是男性按能力数值排序,顺序为feng能力3,ming能力85.最终顺序为hong、shyg、lbao、huan、CSRO、FijK、feng、ming
数据范围
对于所有数据,出生年份<2000对于20%的数据,n ≤ 10对于100%的数据,n ≤ 1000
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct node
{
char name;
int id, year, xb, nl, age, w;
}a[1005];
bool cmp(node x, node y)
{
if(x.w != y.w) return x.w < y.w;
if(y.w == 1)
{
if(x.year != y.year) return x.year > y.year;
}
if(y.w == 2)
{
if(x.year != y.year) return x.year < y.year;
}
if(y.w == 3)
{
if(x.xb != y.xb) return x.xb > y.xb;
else if(x.xb == 0) return x.year > y.year;
else return x.nl < y.nl;
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i].name;
a[i].id = i;
string x, w;
cin >> x;
w = x.substr(6, 4);
a[i].year = stoi(w);
w = x.substr(16, 2);
a[i].xb = stoi(w) % 2;
w = x.substr(18);
a[i].nl = stoi(w);
a[i].age = 2000 - a[i].year;
if(a[i].age < 100) a[i].w = 1;
else if(a[i].age > 1000) a[i].w = 2;
else a[i].w = 3;
}
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++)
{
cout << a[i].name << "\n";
}
}