zoukankan      html  css  js  c++  java
  • 1025 PAT Ranking (25分)

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive number N (≤), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (≤), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:

    registration_number final_rank location_number local_rank
    
     

    The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.

    Sample Input:

    2
    5
    1234567890001 95
    1234567890005 100
    1234567890003 95
    1234567890002 77
    1234567890004 85
    4
    1234567890013 65
    1234567890011 25
    1234567890014 100
    1234567890012 85
    
     

    Sample Output:

    9
    1234567890005 1 1 1
    1234567890014 1 2 1
    1234567890001 3 1 2
    1234567890003 3 1 2
    1234567890004 5 1 4
    1234567890012 5 2 2
    1234567890002 7 1 5
    1234567890013 8 2 3
    1234567890011 9 2 4

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    struct student{
        char id[13];//准考证号
        int score;//分数
        int local_number;//考场号
        int local_rank;//考场排名
    }stu[30010];
    bool cmp(student a, student b)//排序函数
    {
        if(a.score != b.score)
            return a.score > b.score;//先按总分排,再按字母顺序
        else
            return strcmp(a.id , b.id)<0;//按字典顺序排序
    }
    
    int main()
    {
        int n, k ,num=0;//num是总人数,每次输入一个人,就+1
        scanf("%d",&n);
        for(int i=1;i<=n;i++)//对于每一个考场
        {
            scanf("%d",&k);
            for(int j=0;j<k;j++)//对于每一个考场的考生输入信息
            {
                scanf("%s %d",stu[num].id,&stu[num].score);//输入考生信息
                stu[num].local_number = i;//考场号信息
                num++;
            }
    
            sort(stu+num - k, stu+num,cmp);//每次输完一个考场,就排一次考场的排名
            stu[num-k].local_rank = 1;//考场的第一人是第一名
            for(int j=num-k+1;j<num;j++)//从本考场的第二人开始
            {
                if(stu[j].score == stu[j-1].score)//分数相同则名次相同
                    stu[j].local_rank = stu[j-1].local_rank;
                else//否则名排在他前面的人的个数+1
                    stu[j].local_rank = j - (num - k)+1;
            }
        }//接下来计算总的排名
    
        sort(stu,stu+num,cmp);
        int r = 1;//r的总的排名
        printf("%d
    ",num);//输出总人数
        for(int i=0;i<num;i++)
        {
            if(i>0&&stu[i].score != stu[i-1].score)
                r = i+1;
            printf("%s %d %d %d
    ",stu[i].id,r,stu[i].local_number,stu[i].local_rank);
        }
    
        return 0;
    
    
    }

    第二种解法 使用vector

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    struct stu{
        long long no;
        int score;
        int finrank;
        int loca;
        int locarank;
    };
    
    bool cmp1(stu a, stu b)
    {
        return a.score!=b.score ? a.score>b.score : a.no < b.no;
    }
    
    int main()
    {
        int n,m;
        scanf("%d",&n);
        vector<stu> fin;//总的学生数向量
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&m);
            vector<stu> v(m);//每个考场的学生数向量
            for(int j=0;j<m;j++)
            {
                scanf("%lld %d",&v[j].no,&v[j].score);//输入信息
                v[j].loca = i;
            }
            sort(v.begin(),v.end(),cmp1);//考场内排序下
            v[0].locarank = 1;
            fin.push_back(v[0]);//考场第一的先放任总的学生向量中
            for(int j=1;j<m;j++)//标记考场的排名
            {
                if(v[j].score==v[j-1].score)
                    v[j].locarank = v[j-1].locarank;
                else
                    v[j].locarank = j +1;
    
                fin.push_back(v[j]);
            }
        }
    
        sort(fin.begin(),fin.end(),cmp1);
        fin[0].finrank = 1;
        for(int j=1;j<fin.size();j++)//标记总的排名
        {
            fin[j].finrank = (fin[j].score == fin[j-1].score ? fin[j-1].finrank : j+1);
    
        }
    
        printf("%d
    ",fin.size());
        for(int i=0;i<fin.size();i++)
        {
            printf("%013lld %d %d %d
    ",fin[i].no, fin[i].finrank, fin[i].loca, fin[i].locarank);
    
    
        }
    
        return 0;
    
    }
     
  • 相关阅读:
    计算系数
    P2734 [USACO3.3]游戏 A Game——区间dp+博弈论
    4.14作业
    安装MySQL数据库,建立用户表 uid uname upwd 并插入3条数据 2.制作jsp登录页面 index.jsp 提交到ok.jsp,使用jdbc连数据库,判断输入的用户名密码是否存在 3.如果存在,把用户名保存,跳转到yes.jsp
    jsp 3.10作业
    软件测试第一次课堂练习3.4
    easysync 协同算法详解
    支付宝订阅消息推送
    Linux防火墙操作指令
    Windows端口号操作
  • 原文地址:https://www.cnblogs.com/qinmin/p/12601392.html
Copyright © 2011-2022 走看看