zoukankan      html  css  js  c++  java
  • 排队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;
    }
    
    

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

    菜啊!

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319593.html
Copyright © 2011-2022 走看看