图灵普及班排序专题的9.家族迁徙才25分啊,请大佬帮忙改一下

题目描述

由于环境破坏,导致了鱼大大家的环境不再适合居住。鱼大大家族需要举族迁徙。为了路途上的安全,鱼大大需要合理地将族人排队迁徙。鱼大大要求所有家族成员报上身份信息号码。以此提取有效信息进行排队。鱼大大家族的身份信息号码是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

我的代码

#include<bits/stdc++.h>
using namespace std;
struct ans{
	string name;
	int age;
	char m_or_w;
	int kind;
	int can;
    int id;
}b[1000010];
bool cmp(ans x, ans y){
	if(x.kind == y.kind){
		if(x.kind == 1){
			return x.age<y.age;
		}else if(x.kind == 2){
			return x.age>y.age;
		}else{
			if(x.m_or_w == y.m_or_w){
				if(x.m_or_w == 1){
                    if(x.can == y.can){
                        return x.id<y.id;
                    }
					return x.can<y.can;
				}else{
					return x.age<y.age;
				}
			}
			return x.m_or_w>y.m_or_w;
		}
	}
	return x.kind<y.kind;
}
int main(){
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++){
        b[i].id = i;
        string shen;
        string name;
		cin >> name >> shen;
		b[i].name = name;
		int year = 0;
		int month = 0;
		int day = 0;
		for(int i = 6; i < 10; i++){
			year = year*10+(shen[i]-'0');
		}
		for(int i = 10; i < 12; i++){
			month = month*10+(shen[i]-'0');
		}
		for(int i = 12; i < 14; i++){
			day = day*10+(shen[i]-'0');
		}
		int mow = shen[16]-'0';
		int neng = 0;
		for(int i = 18; i < shen.size(); i++){
			neng = neng*10+(shen[i]-'0');
		}
		b[i].age = abs(2000-year);
		b[i].can = neng;
		if(b[i].age < 100){
			b[i].kind = 1;
		}else if(b[i].age > 1000){
			b[i].kind = 2;
		}else{
			b[i].kind = 3;
		}
		if(mow%2 == 1){
			b[i].m_or_w = 1;
		}else{
			b[i].m_or_w = 2;
		}
	}
	sort(b+1, b+1+n, cmp);
	for(int i = 1; i <= n; i++){
		cout << b[i].name << endl;
	}
}

过了前三个样例 25分 WA了!!!

请求指导!!!