时间限制: 1.000 Sec 内存限制: 128 MB
题目描述
在很多场合,我们都需要排队,比如超市付款,医院看病,就餐等等。“尊老爱幼”是中华名族的传统美德,所以在排队的过程中,遇到老人、幼儿我们应该主动让他们排在前面。请按以下 4 条规则编写一个排队的程序。
(1)老人(年龄 ≥ 60 岁)和幼儿(年龄 ≤ 6 岁)比其他人(6 岁 < 年龄 < 60 岁)优先排在队伍的前面,且所有幼儿排在所有老人的前面。
(2)老人按年龄从大到小的顺序排队,年龄大的优先,年龄相同时,先到的人排在前面。
(3)幼儿按年龄从小到大的顺序排队,年龄小的优先,年龄相同时,先到的人排在前面。
(4)其他人只按到达的先后顺序排队。输入
输入共n+1行。
第1行一个整数n,表示排队的总人数。
第2行到第n+1行,按照到达的先后顺序给出了每个人的基本信息。每行两个整数,第一个整数表示这个人的编号(编号保证不会重复,但不保证连续),第二个整数表示这个人的年龄。输出
输出共n行。
每行一个人的编号,表示从前往后的排队结果。样例输入
8 1 14 3 6 4 5 5 62 11 48 17 25 21 60 13 62样例输出
4 3 5 13 21 1 11 17提示
共有8个人参加排队。编号为3和4的两个人为幼儿,年龄分别为6岁和5岁。编号为5、21和13的三个人为老人,年龄分别为62岁、60岁和62岁。根据排队规则,老人和幼儿排在其他人的前面,而幼儿又排在老人的前面,所以先排编号3和4的幼儿。幼儿按年龄从小到大的顺序排队,所以第一个人是4号,然后是3号。接下来排老人,老人年龄大的先排,所以先排5号和13号,但5号比13号先到,所以先排5号,然后13号,接下来21号。剩下的人不论年龄大小,全部按到达的顺序排队,依次为1号、11号和17号。
【数据范围约定】
40%的测试点输入数据保证1≤n≤99,且每个人的年龄都不相同。
60%的测试点输入数据保证1≤n≤1000。
100%的测试点输入数据保证1≤n≤30000,1≤人的编号≤32000,2≤人的年龄≤100。
#include<bits/stdc++.h>
using namespace std;
#define N 30004
struct person{
int time;
int age;
int pos;
}p[N];
//sort自定义排序
int cmp(person a,person b){
if(a.age>6&&a.age<60&&b.age>6&&b.age<60){
return a.time<b.time;
}
else if(a.age<=6&&b.age<=6){
if(a.age==b.age)
return a.time<b.time;
else
return a.age<b.age;
}
else if(a.age>=60&&b.age>=60){
if(a.age==b.age)
return a.time<b.time;
else
//老年,年龄大的在前
return a.age>b.age;
}
//
else if(a.age<=6||b.age<=6)
return a.age<b.age;
else
return a.age>b.age;
}
int main(){
int n,i;
cin>>n;
for(i=0;i<n;i++){
cin>>p[i].pos>>p[i].age;
//按时间排序,定义一个用来作为比较依据
p[i].time=i;
}
sort(p,p+n,cmp);
for(i=0;i<n;i++){
printf("%d",p[i].pos);
if(i!=n) printf("\n");
}
return 0;
}