题目描述:
在很多场合,我们都需要排队,比如超市付款,医院看病,就餐等等。“尊老爱幼”是中华名族的传统美德,所以在排队的过程中,遇到老人、幼儿我们应该主动让他们排在前面。请按以下 4 条规则编写一个排队的程序。
(1)老人(年龄 ≥ 60 岁)和幼儿(年龄 ≤ 6 岁)比其他人(6 岁 < 年龄 < 60 岁)优先排在队伍的前面,且所有幼儿排在所有老人的前面。
(2)老人按年龄从大到小的顺序排队,年龄大的优先,年龄相同时,先到的人排在前面。
(3)幼儿按年龄从小到大的顺序排队,年龄小的优先,年龄相同时,先到的人排在前面。
(4)其他人只按到达的先后顺序排队。
输入输入共n+1行。
第1行一个整数n,表示排队的总人数。
第2行到第n+1行,按照到达的先后顺序给出了每个人的基本信息。每行两个整数,第一个整数表示这个人的编号(编号保证不会重复,但不保证连续),第二个整数表示这个人的年龄。
输出输出共n行。
每行一个人的编号,表示从前往后的排队结果。
Thought:比较简单的一道题。
#include<stdio.h>
#include<string.h>
struct per
{ int ID; int age;};
int main()
{
struct per a[30005],c[30000],d[30000],tmp,b[30000];
int i,j,temp,n,e,f,g;
while(~scanf("%d",&n))
{
e=f=g=0;
for(i=0;i<n;i++)
scanf("%d%d",&a[i].ID,&a[i].age);
for(i=0;i<n;i++)
{
if(a[i].age<=6)
b[e++]=a[i];
else if(a[i].age>=60)
c[f++]=a[i];
else d[g++]=a[i];
}
for(i=0;i<e-1;i++)
{
for(j=0;j<e-i-1;j++)
if(b[j].age>b[j+1].age){
tmp=b[j+1];
b[j+1]=b[j];
b[j]=tmp;}
}
for(i=0;i<f-1;i++)
{
for(j=0;j<f-i-1;j++)
if(c[j].age<c[j+1].age){
tmp=c[j+1];
c[j+1]=c[j];
c[j]=tmp;}
}
for(i=0;i<e;i++)
a[i]=b[i];
j=0;
for(i=e;i<f+e;i++)
a[i]=c[j++];
j=0;
for(i=f+e;i<n;i++)
a[i]=d[j++];
for(i=0;i<n;i++)
printf("%d\n",a[i].ID);
}
return 0;}