排队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。

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n,i,j,cnt=0,xnt=0;
    cin>>n;
    int age[n][2],a[n],b[n];
    for(i=0;i<n;i++)
    {
        cin>>age[i][0]>>age[i][1];
        if(age[i][1]<=6||age[i][1]>=60)
        a[cnt++]=age[i][1];
        else if(age[i][1]>6&&age[i][1]<60)
        {
            b[xnt++]=age[i][0];
        }

    }
    sort(a,a+cnt);
    for(i=0;i<cnt;i++)
    {
        if(a[i]>6)
            break;
        for(j=0;j<n;j++)
        {
            if(a[i]==age[j][1])
            {
               cout<<age[j][0]<<endl;
               age[j][1]=0;
            }
        }
    }
    for(i=cnt-1;i>=0;i--)
    {
        if(a[i]<60)
            break;
        for(j=0;j<n;j++)
        {
            if(a[i]==age[j][1])
            {
                cout<<age[j][0]<<endl;
                age[j][1]=0;
            }
        }
    }

    for(i=0;i<xnt;i++)
    {
        cout<<b[i]<<endl;
    }
    return 0;
}

原来编号小不表示先到。
主要思路就是用二维数组将年龄和编号联系起来,用另外一个一维数组记录年龄,既然不是按照序号再细分。就可以解决了。

菜啊!

原文地址:https://www.cnblogs.com/skyleafcoder/p/12319593.html