1025 PAT 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.
在这里插入图片描述

分析

题意非常简单,就是要根据所给的考场号,考生号,考试成绩给出考生的总体排名和考场排名。
通常这类题是要靠结构体+排序,这里排序通常会有两个或以上指标,方法是利用c++的 S T L 里algorithm头文件的sort()函数,通过构造cmp函数来实现。

关于结构体排序

这里有一个小细节可以注意,若是数字则按大到小排序就是return “>”(大于号),反之就是小于号,而如果是字符串则需用cstring头文件里的strcmp()函数进行 比较大小,同样大到小就是return “>”(大于号),反之就是小于号,只不过后面跟的是0。如下:

#include<cstring>
#include<algorithnm>
using namespace std;

bool cmp(int a, int b) //a,b 为数字类型等
{
	if(a.one != b.one) return a.one > b.one;
	else return a.two < b.two;
}
bool cmp(char a, char b) //a,b 为字符串类型等
{
	if(a.one != b.one) return strcmp(a, b) > 0;
	else return strcmp(a, b) < 0;
}

关于总体排名实现

另外,这题关于考生的总体排名有两种实现方法:
第一种是在输出的时候进行实现:

//这种是在构造结构体的时候没有创建全体排名适合使用
int r = 1;
for(int i = 0; i < num; i++)
{
	if(i > 0 && stu[i].score != stu[i-1].score)
	{
		r = i + 1; // 除了第一项和成绩相等不是按照人数排名,其余均按人数排名
	}
	printf("%d", r);
}

第二种方法是在构建结构体的时候就添加全体排名,这种就是

for(int j = 1; j < fin.size(); j++)
        fin[j].finrank = (fin[j].score == fin[j - 1].score) ? (fin[j - 1].finrank) : (j + 1);

关于场内排名实现

这里还有一个细节关于场内排名的实现,如果靠数组排序则需清楚每一场的第一个和最后一个的坐标,如:

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
			{
				stu[j].local_rank = j + 1 - (num - k);
			}
		}

但有一种方法无须知道坐标,就是用vector神器:

#include<vector>
using namespace std;
for(int i = 1; i <= n; i++) {
        scanf("%d", &m);
        vector<student> 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++) {
            v[j].locarank = (v[j].score == v[j - 1].score) ? (v[j - 1].locarank) : (j + 1);
            fin.push_back(v[j]);
        }
    }

小结

1.掌握结构体排序的常见形式,数字型和字符串型。
2.场内排序可以用vector来简便代码难度,没有vector也要学会数组的方法精髓在于坐标。
3.全局排序既可以一开始就构建全体排名这一项,也可以最后输出的时候再进行计算。
4.排名的实现一看分数,二看已排序的人数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值