PAT甲级1012题解——选择一种合适数据存储方式能使题目变得更简单
题目分析:
本题的算法并不复杂,主要是要搞清楚数据的存储方式(选择一种合适的方式存储每个学生的四个成绩很重要)这里由于N的范围为10^6,故选择结构体来存放对应下标为学生的id(N只有2000的范围,所以结构体开10^6其实有点浪费空间),再者对于每个学生的每种成绩的排名我们通过下面的这种方式可以巧妙得到(而且单科成绩是会出现重复的,即并列的情况):
获取排名的方法:其实很简单,由于会出现并列单科成绩的方式,且单个学生的成绩是存储在结构体里的,通过多次排序的方式去解决这道题目是不太合适的,这里用四个数组a[],c[],m[],e[]存放每种成绩的出现的次数(因为成绩只有0~100的可能),而我们想要知道单科的成绩的排名就只需要对比该分数高的分数共有多少个+1就是该id的同学的该单科的成绩排名(这里已经回避了考虑并列的情况,十分方便!),至此我们就用num_a,num_c,num_m,num_e四个数存放了每次查询的id的四科成绩的排名,最后只要选择一个最小的,有同样最小时选择权重最高的(a > c > m > e),代码中展示了一种巧妙的判断方法,读者在下面阅读时请稍加思考
#include<iostream>
#include<string.h>
using namespace std; int a[];
int c[];
int m[];
int e[];
int vis[];
struct Node{
int A, C, M, E;
}k[]; int main(){
int N, M;
while(scanf("%d%d", &N, &M) != EOF){
memset(vis, , sizeof(vis));
memset(a, , sizeof(a));
memset(c, , sizeof(c));
memset(m, , sizeof(m));
memset(e, , sizeof(e));
for(int i = ; i <= N; i++){
int id;
scanf("%d", &id);
scanf("%d%d%d", &k[id].C, &k[id].M, &k[id].E);
k[id].A = (k[id].C + k[id].M + k[id].E) / ;
vis[id] = ;
a[k[id].A]++;
c[k[id].C]++;
m[k[id].M]++;
e[k[id].E]++;
}
for(int i = ; i <= M; i++){
int id;
scanf("%d", &id);
if(vis[id] == ) printf("N/A\n");
else{
//查询该id的四个成绩的排名
int num_a = ;
int num_c = ;
int num_m = ;
int num_e = ;
for(int j = ; j > k[id].A; j--) num_a += a[j];
for(int j = ; j > k[id].C; j--) num_c += c[j];
for(int j = ; j > k[id].M; j--) num_m += m[j];
for(int j = ; j > k[id].E; j--) num_e += e[j];
//此时得到的num是比该查询id的单一每种成绩高的个数 id的每种成绩的排名要再+1(这样的方式默认为存在并列情况)
//接下来要选择四个排名中最小的 如果有同样小的则按照权重a > c > m > e
if(num_a <= num_c && num_a <= num_m && num_a <= num_e){
printf("%d A\n", num_a + );
}else if(num_c <= num_m && num_c <= num_e){
printf("%d C\n", num_c + );
}else if(num_m <= num_e){
printf("%d M\n", num_m + );
}else{
printf("%d E\n", num_e + );
}
}
}
}
return ;
}
PAT甲级1012题解——选择一种合适数据存储方式能使题目变得更简单的更多相关文章
- Android编程中的5种数据存储方式
Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...
- PAT甲级1012. The Best Rank
PAT甲级1012. The Best Rank 题意: 为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语.同 ...
- Android五种数据存储方式
android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...
- MYSQL 4种插入数据的方式比较
4种插入数据的方式 第一种:insert into insert into是最常用的插入数据的方式,可以单条插入,也可以多条,还可以指定从其他表中select然后插入. 详细可以参考:insert语法 ...
- Node.js 数据存储方式的选择
如何为你的 Node.js 应用挑选数据库 Node.js 应用一般有三种方式保存数据. 不使用任何数据库管理系统(DBMS),把数据保存在内存里或直接使用文件系统. 使用关系数据库.例如 MySQL ...
- Request三种获取数据的方式
今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...
- Android中的5种数据存储方式
本文转自 http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...
- Android四种数据存储方式
一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
随机推荐
- [MySQL] MySQL存储过程 事务transaction 数据表重建
直接上代码 -- 删除存储过程 DROP PROCEDURE IF EXISTS `renew_message_queue`; -- 添加; 的转义 DELIMITER ;; CREATE PROCE ...
- ANR无法生成traces.txt文件
在有些设备上ANR无法生成traces.txt文件,kill -3又不能准确把握时机或者没权限,可能是软件访问这个路径失败,可以在/data/anr/下面建立一个空的traces.txt,注意保证an ...
- 【Docker学习之一】初始Docker
一.云计算的概念 PaaS(Platform-as-a-Service:平台即服务),把应用服务的运行和开发环境作为一种服务.SaaS(Software-as-a-Service),意思为软件即服务, ...
- 2019 CSP-J 游记(CQ LNBS考场 的退役之战)
T0.10 爆零之战 已经不是第一次参加NOIP了(哦,关于兔子也NOIP了) 这次比赛的话,感觉考场很温馨,键盘很舒适,老师很友善,下次还会来.(哦不,下次来不了了,即将提前退役[大雾]) 刚刚文化 ...
- 对decimal 类型的数据进行获取调整
Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数. 好处:使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储 ...
- oracle 在列名后的 (+)是什么意思,如何转换为mysql
外连接的意思select *from a,bwhere a.id=b.id(+)意思就是返回a,b中匹配的行 和 a中有但是b中没有的行. 参考https://www.cnblogs.com/Aaro ...
- [转帖](区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗?
(区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗? http://baijiahao.baidu.com/s?id=1600948969290990883&wfr=spide ...
- netcore 步骤
1.创建工程目录 d:\project 2.进入目录,创建解决方案 dotnet new sln 3.确定开发版本 dotnet --list-sdks //列出sdk版本 dotnet new gl ...
- 资源池-数据库连接池简单实现-JAVA版本
转载:https://www.jianshu.com/p/381c86bdbff6 看了看druid和dbcp2的原码,发现他们都有各自存储连接的方式. druid : private volatil ...
- Ramdisk根文件系统映像的修改与创建
本文简述Ramdisk根文件系统映像的修改以及创建,并附相关脚本以实现自动化配置,而根文件系统的制作过程请网上自行搜索.相关过程尽可能以图的方式展示出来,重在说明操作的过程,仅供参考. Ramdisk ...