算法学习第八篇
有n个考点,每个考点里面都有考生进行考试,如果现在分别给定每个考场的人数及该考场里面的考生编号和成绩,现在要求将所有考生按分数从高到底进行排序,并按顺序输出所有考生编号、排名(分数相同则按编号大小排序)、考场号、以及考场内部的排名。
分析:1.必然需要考虑先构造结构体,然后依次读入学生信息,再考虑对结构体的排序问题。2.编写cmp函数,使排序满足题目的要求。3.计算总排名,并且输出考生信息。
输入:
2
3
153821001 95
153821005 100
153821010 95
2
153821002 90
153821004 100
输出:
5
153821004 1 2 1 //编号,排名,考场号,考场排名
153821005 1 1 1
153821001 3 1 2
153821010 3 1 2
153821002 5 2 2
代码如下:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct stu
{
char id[20];
int score;
int local_id;
int local_rank;
int sum_rank;
};
stu S[30000];
bool cmp(stu a, stu b)
{
if(a.score!=b.score) return a.score>b.score; //分数从高到低
else
return strcmp(a.id, b.id) < 0; //a<b返回负数、a=b返回0、a>b返回正数
}
int main()
{
int n,k,l,st=0,sum=0;
scanf("%d", &n);
for (int i=1;i<=n;i++)
{
scanf("%d", &k);
sum += k;
l=st;
for (int j=0;j<k;j++)
{
scanf("%s %d",S[st].id,&S[st].score); //输入信息
S[st].local_id = i;
st++;
}
sort(S+l,S+l+k,cmp);
S[l].local_rank = 1; //给定一号
for (int m=l+1;m<l+k;m++)
if (S[m].score==S[m-1].score)
S[m].local_rank=S[m-1].local_rank;
else
S[m].local_rank=m-l+1;
}
sort(S,S+st,cmp);
printf("%d\n", sum);
printf("%s %d %d %d\n",S[0].id,1,S[0].local_id,1);
S[0].sum_rank = 1;
for (int i=1;i<sum;i++)
if (S[i].score==S[i-1].score) //如果与前面分数相同
{
S[i].sum_rank=S[i-1].sum_rank;
printf("%s %d %d %d\n",S[i].id,S[i].sum_rank,S[i].local_id,S[i].local_rank);
}
else
{
S[i].sum_rank=i+1;
printf("%s %d %d %d\n",S[i].id,S[i].sum_rank,S[i].local_id,S[i].local_rank);
}
system("pause");
return 0;
}