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),代码中展示了一种巧妙的判断方法,读者在下面阅读时请稍加思考

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4
 5 int a[105];
 6 int c[105];
 7 int m[105];
 8 int e[105];
 9 int vis[1000000];
10 struct Node{
11     int A, C, M, E;
12 }k[1000000];
13
14 int main(){
15     int N, M;
16     while(scanf("%d%d", &N, &M) != EOF){
17         memset(vis, 0, sizeof(vis));
18         memset(a, 0, sizeof(a));
19         memset(c, 0, sizeof(c));
20         memset(m, 0, sizeof(m));
21         memset(e, 0, sizeof(e));
22         for(int i = 1; i <= N; i++){
23             int id;
24             scanf("%d", &id);
25             scanf("%d%d%d", &k[id].C, &k[id].M, &k[id].E);
26             k[id].A = (k[id].C + k[id].M + k[id].E) / 3;
27             vis[id] = 1;
28             a[k[id].A]++;
29             c[k[id].C]++;
30             m[k[id].M]++;
31             e[k[id].E]++;
32         }
33         for(int i = 1; i <= M; i++){
34             int id;
35             scanf("%d", &id);
36             if(vis[id] == 0) printf("N/A\n");
37             else{
38                 //查询该id的四个成绩的排名
39                 int num_a = 0;
40                 int num_c = 0;
41                 int num_m = 0;
42                 int num_e = 0;
43                 for(int j = 100; j > k[id].A; j--) num_a += a[j];
44                 for(int j = 100; j > k[id].C; j--) num_c += c[j];
45                 for(int j = 100; j > k[id].M; j--) num_m += m[j];
46                 for(int j = 100; j > k[id].E; j--) num_e += e[j];
47                 //此时得到的num是比该查询id的单一每种成绩高的个数 id的每种成绩的排名要再+1(这样的方式默认为存在并列情况)
48                 //接下来要选择四个排名中最小的 如果有同样小的则按照权重a > c > m > e
49                 if(num_a <= num_c && num_a <= num_m && num_a <= num_e){
50                     printf("%d A\n", num_a + 1);
51                 }else if(num_c <= num_m && num_c <= num_e){
52                     printf("%d C\n", num_c + 1);
53                 }else if(num_m <= num_e){
54                     printf("%d M\n", num_m + 1);
55                 }else{
56                     printf("%d E\n", num_e + 1);
57                 }
58             }
59         }
60     }
61     return 0;
62 } 

原文地址:https://www.cnblogs.com/findview/p/11666346.html

时间: 2024-07-29 19:53:34

PAT甲级1012题解——选择一种合适数据存储方式能使题目变得更简单的相关文章

IOS的四种数据存储方式和优略

IOS有四种常用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息,它通过一个工厂方法返回默认的.也是最常用到的实例对象.这个对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项.他在IOS6之后已经在文件沙盒中看不到它的信息了,所以可以存储机密信息(用户名和密码)密码,防止手机系统被破解后看你的沙盒子文件.一般这种方法存储少量信息,若是存储大量

Android 数据存储方式分为哪几种?

10道题值得思考 第一道题 1.Android 数据存储方式分为哪几种? SharedPreferences存储数据 2. CotentProvider内容提供者 3. 文件存储 4. 数据库存储(Sqlite) 5.网络存储 2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译器,并提供了相应的mk文件隔离

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

如何为你的 Node.js 应用挑选数据库 Node.js 应用一般有三种方式保存数据. 不使用任何数据库管理系统(DBMS),把数据保存在内存里或直接使用文件系统. 使用关系数据库.例如 MySQL, PostgreSQL. 使用非关系数据库.例如 Redis,MongoDB,CouchDB, PouchDB 无服务器数据存储 (Serverless Data Storage) 从管理上来说,第一种方式是最方便易用的.不需要安装任何数据库,直接使用内存和文件就行了. 无需数据库的内存存储就是使

android五种数据存储方式

在Android中提供了如下五种数据存储方式: SharedPreferences 文件存储 SQLite数据库方式 内容提供器(ContentProvider) 网络存储 下面具体介绍一下这五种数据存储方式的用法. 1. SharedPreferences SharedPreferences是android平台上的一个轻量级存储类,主要保存一些常用的配置信息.可以保存long.int.String类型数据. SharedPreferences以键值对方式读取和存入,最终会以XML方式保存数据,

如何增大二维码种的数据存储

最近在做项目,需求就是要传尽量多的数据,属于一个调研,估计后期会加入到项目里面,二维码其实不推荐放入大量数据,但是需求嘛,拿钱干活,可能后期还会优化,因为目前的画扫描的效率不高,主要直接用的原生的开源库zxing感觉效率不高. 一开始,从数据源下手,进行数据源压缩,首先尝试了hufman编码,huffman主要是一些开源的算法,但是实现从建树到压缩,其实有很大区别,文件我直接上传了,有兴趣的可以看一下: http://download.csdn.net/detail/shidongdong201

IOS的四种数据存储方式及优劣

IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用到的实例对象. 这个对象中储存了系统中用户的配置信息,开发人员能够通过这个实例对象对这些已有的信息进行改动.也能够依照自己的需求创建新的配置项. 他实际上是存储于文件沙盒中的一个.plist文件,而且没有被系统加密,仅仅是ios6以后不是存于经常使用的文档文件夹下,所以不破解系统是看不到该文件的.所

Request三种获取数据的方式

今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Request.QueryString: 该方法主要是获取页面路径URL的参数: 2. Request.Form:该方法主要是以post请求方式获取报文体的参数: 3. Request.param:包含上面两种方式,它会在QueryString,Form,ServerVariable中都搜索一遍: 而我今

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对

四种保存数据的方式

转载地址:http://blog.csdn.net/tianyitianyi1/article/details/7713103 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder: