算法笔记——sort()函数及【PTA A1025】Ranking 的题解

sort()函数

/*使用必须加入头文件#include<algorithm>*/
sort(元素首地址(必填),尾元素地址的下一个地址(必填),cmp比较函数(非必填));
/*没有cmp比较函数时,数据按递增输出*/

cmp比较函数

int型

bool cmp(int a,int b)
{return a>b;}//此时按从大到小排列

double型

bool cmp(double a,double b)
{return a>b;}//按大到小排列

char字符型

bool cmp(char a,char b)
{return a<b;}//按字典序排列

通过一个小程序来了解吧

#include<bits/stdc++.h>
using namespace std;
bool cmp_int(int a,int b) {
return a>b;
}
bool cmp_double(double a,double b) {
return a>b;
}
bool cmp_char(char a,char b) {
return a>b;
}
int main()
{
    int a[5]={1,4,2,6,3};
    double b[5]={2.4,1.6,3.9,1.1,5.8};
    char c[5]={'c','e','a','d','q'};
    sort(a,a+5,cmp_int);
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
        cout<<endl;
    sort(b,b+5,cmp_double);
    for(int i=0;i<5;i++)
        cout<<b[i]<<" ";
        cout<<endl;
    sort(c,c+5,cmp_char);
    for(int i=0;i<5;i++)
        cout<<c[i]<<" ";
    return 0;
}

【PTA A1025】Ranking

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

题目大致翻译:

编程能力测试(PAT)由浙江大学计算机科学与技术学院主办。每个测试应该同时在几个考场进行,并且在测试之后,排名列表将立即被合并。现在,你的工作是编写一个程序来正确地合并所有的排名列表,并生成最终的排名。

输入格式:

每个输入文件包含一个测试用例。对于每种情况,第一行包含一个正数N(≤100),即考场的数量。然后是N个排名列表,每个排名列表的第一行包含一个正整数K(≤300),即被测试者的数量,然后是K行包含注册号(13位数字)和每个被测试者的总分。一行中的所有数字都用空格隔开。

输出格式:

对于每个测试用例,首先在一行中打印被测试者的总数。然后按如下格式打印最终的排名:
registration_number final_rank location_number local_rank
(登记号码 最终排名 考场编号 考场内排名)
位置编号从1到n。输出必须按最终排名的非递减顺序排序。具有相同分数的被试必须具有相同的排名,输出必须按其注册号的非降序排列。

样例输入:

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

样例输出:

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<bits/stdc++.h>
using namespace std;
#define Max 100
struct Ranking
{
    char id[20];//准考证号
    double Score;//分数
    int Space;//考场号
    int Space_Ranking;//考场内成绩排名
    int Total_Ranking;//总成绩排名
}S[Max];
bool cmp(Ranking a,Ranking 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;//考场数,考场人数,总人数
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>k;
    for(int j=0;j<k;j++) {
        cin>>S[num].id>>S[num].Score;
        S[num].Space=i;//
        num++;
    }
    sort(S+num-k,S+num,cmp);//将该考场考生排序
    S[num-k].Space_Ranking=1;//每个考场的第一个人的考场排名为1
    for(int j=num-k+1;j<num;j++)
        if(S[j].Score==S[j-1].Score)
        S[j].Space_Ranking=S[j-1].Space_Ranking;
    else
        S[j].Space_Ranking=j+1-(num-k);
    }
    cout<<num<<endl;
    sort(S,S+num,cmp);//总人数排序
    S[0].Total_Ranking=1;//第一个人的总排名为1
    for(int i=1;i<num;i++)
        if(S[i].Score==S[i-1].Score)
        S[i].Total_Ranking=S[i-1].Total_Ranking;
    else
        S[i].Total_Ranking=i+1;
    for(int i=0;i<num;i++)
        cout<<S[i].id<<" "<<S[i].Total_Ranking<<" "<<S[i].Space<<" "<<S[i].Space_Ranking<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/105131424
今日推荐