家族迁徙(只有20分)!!!

题目ID:15900
时间限制: 1000ms
空间限制: 524288kB

题目描述

由于环境破坏,导致了鱼大大家的环境不再适合居住。鱼大大家族需要举族迁徙。为了路途上的安全,鱼大大需要合理地将族人排队迁徙。鱼大大要求所有家族成员报上身份信息号码。以此提取有效信息进行排队。鱼大大家族的身份信息号码是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
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;
struct node{
string name;
int old,xb;
long long nl,no;
}a[1005],b[1005],c[1005];
string s,d;
bool cmp1(node x,node y){
return x.old<y.old;
}
bool cmp2(node x,node y){
return x.old>y.old;
}
bool cmp3(node x,node y){
if(x.xb!=y.xb)return x.xb<y.xb;
if(x.xb==0){
return x.old<y.old;
}
if(x.xb==1){
if(x.nl!=y.nl)return x.nl>y.nl;
else return x.no<y.no;
}
}
int main(void)
{
int n;
cin>>n;
int a1=0,b1=0,c1=0;
for(int i=1;i<=n;i++){
cin>>s>>d;
long long ans=0;
int na=2000-((d[6]-‘0’)*1000+(d[7]-‘0’)*100+(d[8]-‘0’)*10+(d[9]-‘0’));
if(na<100){
a1++;
a[a1].name=s;
a[a1].old=na;

	}
	else if(na>1000){
		b1++;
		b[b1].name=s;
		b[b1].old=na;
		
	}
	else if(na>=100&&na<=1000){
		c1++;
		c[c1].name=s;
		c[c1].old=na;
		if((d[16]-'0')%2==0){
			c[c1].xb=0;
		}
		else{
			c[c1].xb=1;
		}
		long long sum=0;
		sum=i;
		c[c1].nl=sum;
		c[c1].no=ans;
		
	}
}
sort(a+1,a+1+a1,cmp1);
sort(b+1,b+1+b1,cmp2);
sort(c+1,c+1+c1,cmp3);
for(int i=1;i<=a1;i++){
	cout<<a[i].name<<endl;
}
for(int i=1;i<=b1;i++){
	cout<<b[i].name<<endl;
}
for(int i=1;i<=c1;i++){
	cout<<c[i].name<<endl;
}
return 0;

}
大佬救救我

7 个赞

代码格式化

4 个赞

当我没说

4 个赞

fish结构体

struct fish{
	string name,id;//名字,身份证号
	int age;//年龄
	int sex;//性别
	int index;//报道顺序
	int power;//能力值
}a[1005];

cmp比较函数(核心代码)


// 比较函数,用于确定鱼的优先级
bool cmp(fish x, fish y) {
	//小孩
	if(x.age<100||y.age<100){
		if(x.age==y.age) return x.index<y.index;
		else return x.age<y.age;
	}
	//老年
	else if(x.age>1000||y.age>1000){
		if(x.age==y.age) return x.index<y.index;
		else return x.age>y.age;
	}
	//成年
	else{
		if(x.sex!=y.sex) return x.sex<y.sex;
		else if(!x.sex&&!y.sex){
			if(x.age==y.age) return x.index<y.index;
			else return x.age<y.age;
		}
		else if(x.sex&&y.sex){
			if(x.power==y.power) return x.index<y.index;
			else return x.power<y.power;
		}
	}
	return true;
}

输入之后,要把string类型的身份证号用stoi(a[i].id(第n位-第m位))就可以把身份证号转化成int类型了,最后,再用一个sort(a,a+n,cmp);就可以排序完成了,最后输出
(给个解决方案)
这道题我之前做过

6 个赞

输入部分有问题,赋值a[i].age的时候应该赋值为2000-stoi(s.substr(6,4));
赋值性别的时候应该赋值为(s[16]-'0')%2;
赋值能力应该赋值为stoi(s.substr(18,90));
sort的时候要加上一个+1,写成sort(a+1,a+n+1.cmp);
其他应该没问题了

1 个赞

解决方案 !!!!! @linan04007

1 个赞