题目分析:

本题的算法并不复杂,主要是要搞清楚数据的存储方式(选择一种合适的方式存储每个学生的四个成绩很重要)这里由于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. 爬虫笔记之teambition登录验证码

    一.缘起 想做的事情太多,计划乱糟糟,想找个工具理一下,想起来了的很久之前用过teambition,打算看一下,然后在登录界面看到一个比较有意思的验证码: 这种倒是比较有意思哈,看着像是模仿12306 ...

  2. (十)redis源码解读

    一.redis工作机制 redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行. 二.为什么redis速度快? 1.基于内存 2.redis协议resp 简单.可读.效率高 ...

  3. jsp标签${fn:contains()}遇到问题记录

    在jsp页面要实现这样一个功能,列表的某一列字段要显示的数据,是从后台的一个列表中获取的,数据库里面该列存储的方式是 类似 1,2,3 这样的 主键id数据.显示的时候要根据id显示名称,如果是多个 ...

  4. php删除目录及目录下的内容

    今天遇到一个问题: java写的API,ppt转图片生成的目录和文件 在使用php调用API完成后,再使用php进行删除时,遇到了删除失败的问题 部署的环境是Ubuntu 导致删除失败的原因是权限的问 ...

  5. Modelsim SE-64 10.4的安装 、破解以及远程使用

    1.准备好modelsim SE-64 10.4的安装包和破解文件(modelsim-win64-10.4-se.exe  和MentorKG.exe ,patch_dll.bat). 2.安装 好  ...

  6. Juju solutions for OpenStack

    Juju solutions for OpenStack Juju makes it easy to deploy OpenStack at scale. Quickly and reliably b ...

  7. 服务器端debug操作

    写好的代码打个包放在服务器上,发现与理想的情况下不一致.查看log日志又觉得很烦,毕竟debug调试才是王道. 下面来说说怎么debug调试服务器上的.最好服务器上的代码和本地的保存一致,这样误差会小 ...

  8. Java中参数始终是按值传递

    Java中参数始终是按值传递. public class Main { public static void main(String[] args) { int x = 5; change(x); S ...

  9. 阿里云负载均衡SLB上用免费的Let's Encrypt的SSL证书

    Let's Encrypt是很火的一个免费SSL证书发行项目,自动化发行证书,证书有90天的有效期.Let's Encrypt已经发布了工具certbot,用此工具生成证书.证书续期非常简单. 以下是 ...

  10. java基础 String

    标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...