题目分析:

本题的算法并不复杂,主要是要搞清楚数据的存储方式(选择一种合适的方式存储每个学生的四个成绩很重要)这里由于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题解——选择一种合适数据存储方式能使题目变得更简单的更多相关文章

  1. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  2. PAT甲级1012. The Best Rank

    PAT甲级1012. The Best Rank 题意: 为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语.同 ...

  3. Android五种数据存储方式

    android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...

  4. MYSQL 4种插入数据的方式比较

    4种插入数据的方式 第一种:insert into insert into是最常用的插入数据的方式,可以单条插入,也可以多条,还可以指定从其他表中select然后插入. 详细可以参考:insert语法 ...

  5. Node.js 数据存储方式的选择

    如何为你的 Node.js 应用挑选数据库 Node.js 应用一般有三种方式保存数据. 不使用任何数据库管理系统(DBMS),把数据保存在内存里或直接使用文件系统. 使用关系数据库.例如 MySQL ...

  6. Request三种获取数据的方式

    今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...

  7. Android中的5种数据存储方式

    本文转自  http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...

  8. Android四种数据存储方式

    一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...

  9. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

随机推荐

  1. Spark实战系列目录

    1 Spark rdd -- action函数详解与实战 2 Spark rdd -- transformations函数详解与实战(上) 3 Spark rdd -- transformations ...

  2. Parcel 搭建浏览器自动刷新的 非 SPA项目

    重点:parcel index.html 需要引入 index.js 否则不自动刷新

  3. Kubernetes平台环境搭建

    软件 版本 Linux操作系统 CentOS7.4 Kubernetes 1.12 Docker 18.xx-ce Etcd 3.x Flannel 0.10 角色 IP 组件 推荐配置 master ...

  4. 容器服务如何在企业客户落地?Rancher 解决之道分享

    Docker 的优势和趋势我想不必再赘述,那么对于非互联网公司的传统企业客户,以及我们大量的围绕企业客户做集成.交付解决方案的服务提供商,需要考虑的一个问题就是怎么样把容器技术以高质量.低成本.易维护 ...

  5. Android Studio使用adb命令连接平板

    有需要使用adb命令连接调试平板的同学可以参考下(下面是android官方文档,有点老). http://donandroid.com/how-to-install-adb-interface-dri ...

  6. electron实现MessageBox

    1.在渲染进程引用主进程模块 var remote = require('electron').remote; var dialog = remote.dialog; 2.实现一点简单的确定取消操作 ...

  7. 如何改变 select 元素的高度

    mozilla 对于美化 select 元素的样式有这样一段描述(用 CSS 美化 Select 元素): 众所周知,select 元素很难用 CSS 进行高效的设计.你可以影响任何元素的某些方面 - ...

  8. 构建C1000K的服务器(1) – 基础

    转自: http://www.ideawu.net/blog/archives/740.html 著名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10 ...

  9. Dubbo2.7.3入门

    2.7.X的Dubbo,包名不再是com.alibaba,而是org.apache 先看工程目录结构 一个公共api模块,一个SpringBoot项目充当Dubbo服务,一个SpringBoot项目充 ...

  10. Docker容器数据管理(数据卷&数据卷容器)

    一:前言 在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案: 1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境 ...