PTA 1085 PAT单位排行 (map和set)

本文介绍了一个基于PAT竞赛的单位排名程序实现,通过使用C++语言和数据结构如map和结构体,实现了对不同单位的加权总分、人数进行排序,并输出排名。文章详细展示了如何读取输入、处理数据并进行排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1085 PAT单位排行 (25 分)

在这里插入图片描述

#include <algorithm>
#include <string.h>
#include <cctype>
#include <map>
#include <cstdio>
using namespace std;
 
struct School
{
	char name[7];	// 学校名
	int grade;		// 学校加权总分
	int people;		// 学校人数
	int rank;		// 学校排名
}S[100001];
 
int cmp(School s1, School s2)
{	/* 按题目要求进行排序 */
	if (s1.grade != s2.grade)
		return s1.grade > s2.grade;
	else 
	{
		if (s1.people != s2.people)
			return s1.people < s2.people;
		else
			return strcmp(s1.name, s2.name) < 0;
	}
}
 
void ToLower(char *s)
{	/* 大小写转换 */
	for (int i = 0; i < strlen(s); i++)
		s[i] = tolower(s[i]);
}
 
int main(int argc, char const *argv[])
{	/* 能用scanf的地方就用scanf,能用printf的地方就用printf,不然会超时 */
	int N, idx = 0;
	double grade;
	char ID[7], name[7];
	scanf("%d", &N);
	map <string, double> mGrade, mNum, mName;	// 保存学校成绩,和学校人数,和学校姓名
	for (int i = 0; i < N; i++)
	{
		scanf("%s %lf %s", ID, &grade, name);
		ToLower(name);	// 全部转为小写
		if (!mName[name])
		{	/* 记录不重复的名字和个数 */
			strcpy(S[idx++].name, name);
			mName[name]++;
		}
		mNum[name]++;
		if (ID[0] == 'T')
			mGrade[name] += grade*1.5;
		else if (ID[0] == 'A')
			mGrade[name] += grade;
		else
			mGrade[name] += grade/1.5; 
	}
	for (int i = 0; i < idx; i++)
	{
		S[i].grade = (int)mGrade[S[i].name];
		S[i].people = mNum[S[i].name];
	}
	sort(S, S+idx, cmp);
	printf("%d\n", idx);	// 输出单位个数
	S[0].rank = 1;
	cout << 1 << " " << S[0].name << " " << S[0].grade << " " << S[0].people << endl;
	for (int i = 1; i < idx; i++) 
	{	
		if (S[i].grade == S[i-1].grade)	// 如果成绩相同
			S[i].rank = S[i-1].rank;
		else
			S[i].rank = i+1;
		printf("%d %s %d %d\n",S[i].rank, S[i].name, S[i].grade, S[i].people);
	}
	return 0;
}

### 关于浙江大学PTA C++相关内容 目前提供的引用主要集中在C语言相关的练习题实现方法上,尚未涉及具体的浙江大学PTA C++课程资料或研究项目。然而,可以推测浙江大学作为国内顶尖高校之一,在其计算机科学教育体系中必然有丰富的C++教学资源技术实践案例。 以下是基于现有信息以及扩展的知识点整理的内容: #### 1. **关于浙江大学PTA平台** 浙江大学的PAT (Programming Ability Test) PTA 平台是面向学生编程能力测试的重要工具。虽然大部分公开题目集中于C/C++基础算法、数据结构等内容,但也有部分高级主题可能涉及到更复杂的C++特性应用[^5]。 #### 2. **潜在的C++课程内容方向** 尽管未提供具体C++实例,但从逻辑推断可知浙大PTA可能会覆盖如下几个方面: - 面向对象编程(OOP): 类定义、继承机制、多态性等核心概念。 - STL标准模板库的应用: 如`vector`, `map`, `set`容器操作及迭代器使用技巧。 - 文件I/O处理: 学习如何读写外部文件完成批量数据分析任务。 下面给出一段简单的STL vector使用的例子展示基本功能: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vec; // 添加元素至末尾 vec.push_back(1); vec.emplace_back(2); // 访问第一个与最后一个元素 int firstElement = vec.front(); // 输出1 int lastElement = vec.back(); // 输出2 return 0; } ``` #### 3. **可能的研究项目领域** 对于更高层次的学习者来说,参与实际科研活动是非常有益的经历。假设存在某些特定领域的研究课题,则它们很可能围绕但不限于以下几个热门话题展开讨论: - 嵌入式系统开发:利用现代嵌入式框架构建高效能设备驱动程序; - 图形渲染引擎优化:探索GPU加速下的三维场景绘制原理; - 大规模分布式计算架构搭建:通过MPI/OpenMP并行化手段提升运算效率; 以上仅列举了一些可能性较大的分支供参考考虑而已,并不代表真实情况全部范围内的详尽描述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给个选择

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值