排队IV

题目描述
在很多场合,我们都需要排队,比如超市付款,医院看病,就餐等等。“尊老爱幼”是中华名族的传统美德,所以在排队的过程中,遇到老人、幼儿我们应该主动让他们排在前面。请按以下 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。

本来听见单的的题目 一直再用sort 过不去
改成了冒泡过了

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
struct Node{
int start;
int age;
}node[30005];
struct Old{
int start;
int age;
}old[30005];
int main()
{
int n;
int a[30005],b[30005];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%d%d",&a[i],&b[i]);
int cot1=0;
int cot2=0;
for(int i=0;i<n;i++){
if(b[i]<7){
node[cot1].age=b[i];
node[cot1].start=a[i];
cot1++;
a[i]=0;
}
if(b[i]>59){
old[cot2].age=b[i];
old[cot2].start=a[i];
cot2++;
a[i]=0;
}
}
for(int i=0;i<cot1-1;i++)
for(int j=0;j<cot1-i-1;j++){
if(node[j].age>node[j+1].age){
swap(node[j].age,node[j+1].age);
swap(node[j].start,node[j+1].start);
}
}
for(int i=0;i<cot2-1;i++)
for(int j=0;j<cot2-i-1;j++){
if(old[j].age<old[j+1].age){
swap(old[j].age,old[j+1].age);
swap(old[j].start,old[j+1].start);
}
}
for(int i=0;i<cot1;i++)
printf("%d\n",node[i].start);
for(int i=0;i<cot2;i++)
printf("%d\n",old[i].start);
for(int i=0;i<n;i++){
if(a[i]!=0)
printf("%d\n",a[i]);
}
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值