NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) 【STL-map】

  • NUIST OJ 1364 2017 江苏科技大学 程序设计竞赛D重复成绩统计改编 STL-map

    • 题目
    • map
      • map使用
      • map插入
      • map查找
      • map的清空与判断是否为空
      • map的删除
      • map内排序
    • 解题代码
    • 随便说说
    • 再来一个随便说说

题目

题目描述

上海闵行膜法学院刚刚结束了高等膜法期中考试,现在有 N ( 0 < N < 1000000) 个学生的成绩需要统计,管理教学的长者们想要知道成绩的总体分布情况,请将不同分数的成绩和人数统计好并分别输出。

输入描述

有多组测试数据,每组测试数据占若干行。
在第 1 行中,有一个数字 N。
在第 2 到第 N + 1 行中,每行一个数字,代表这是一个学生的成绩。
所有数据保证在 32 位有符号整数范围内。

输出描述

每一行的输出格式为:成绩 取得这个成绩的人数。
注意:成绩和取得这个成绩的人数中间有一个空格! 同时,输出的时候。请按成绩的大小从低到高输出
由于数据量较大,请尽量使用时间复杂度较低的排序算法。

样例输入

5
45
45
45
60
60
6
100
60
100
100
50
60

样例输出

45 3
60 2
50 1
60 2
100 3

若是没有接触过STL-map,则很直接会想到用数组或是顺序栈来储存数据,利用 algorithm 中的sort()进行排序。若是遍历到了则相应数据+1,没有遍历到则插入。或者是使用链栈的结构存储。这样就不需要搬动或是交换数据,但是其需要两个值域分别表示成绩与人次,且查找插入也比较麻烦。
由此,有没有一种高效简洁的结构来存储这样一对一的数据呢。这就是STL中的map

map

map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value。其中,key是唯一的。
其中key和value可以根据需要来使用。也可以是自定义的结构体或类,甚至可以嵌套另一个map。例如,需要key值为姓名,value为电话号码,那么描述函数就可以写成

map<string,int>info;

这样就声明了一个key为string类型,value为int类型的map容器。
上面说到key值是唯一的,那么即不可能同时满足
info[MFS]==1;
info[MFS]==2;
若存在同时创建了两个key相同的情况,前一个即被覆盖。

map使用

使用map需包含map类所在的头文件:

#include <map>

描述函数

Template<class T1, class T2>

map插入

map插入有三种方式
1.用insert方法插入pair对象:

info.insert(pair<string, int>("MSF", 1));

2.用insert方法插入value_type对象:

info.insert(map<string, int>::value_type ("MSF", 1));

3.用数组方式插入值:

info["MSF"] = 1;
info["JZM"] = 2;
......

第三种方式存在性能问题。插入”JZM”时,先在info中查找key为”JZM”的元素,没发现,然后将一个新的元素插入info,key是”JZM”,value为空,插入完成后,将value赋为需要的值。 该方法会将每个value都赋为缺省值,然后再赋为需要的值,如果元素是复杂的类或者结构体,则进行了许多无意义的操作,较为浪费时间。而前两种方法可以避免这个问题。

map查找

可以使用find()和count()函数来发现一个键是否存在。

对于find()函数,先介绍begin()和end()两个成员函数,分别代表map实例对象中第一个元素和最后一个元素其后的一个位置,函数返回类型是iterator.

map<int, string>::iterator iter;
iter = info.find("JZM");
if(iter != info.end())
{…………/*find*/}
Else
{…………/*can not find*/}

iter是一个iterator类对象。这里的iterator是在template class map中声明的一个类,所以需要用

map<int, string>::iterator iter

来声明一个迭代器iter。

其次介绍count()函数。用count函数来判定关键字是否出现,但其无法定位数据出现位置。由于map一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1。

map的清空与判断是否为空

清空map中的数据可以用clear()函数,
判定map中是否有数据可以用empty()函数,其返回值类型为bool

map的删除

1.如果要删除”JZM”,用迭代器删除

map<int, string>::iterator iter;
iter = info.find("JZM");
info.erase(iter);

2.如果要删除“JZM,用关键字删除

int n = info.erase("JZM");
//如果删除了会返回1,否则返回0

3.用迭代器,成片的删除

info.earse(info.begin()+m, info.end()-n);

注:删除区间是一个前闭后开的集合

map内排序

此处回顾一下map的定义

template < class Key, class T, class Compare = less<Key>,  class Allocator = allocator<pair<const Key,T> > > class map;  

其一共有四个参数,第四个是 Allocator,用来定义存储分配模型。
而第三个参数: class Compare = less<key, value>
map这里指定less作为其默认比较函数,其实质是对operator()操作符的重载。所以如果不自己指定Compare(),map中键值对就会按照Key的less顺序进行存储。 less是stl里面的一个函数对象,利用定义的 < 运算符进行比较。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。
这也是作为key的类型必须能够进行 < 运算比较【可以通过重载实现】的原因。若不能,则需要自己写比较函数,否则编译报错
这样,若是不想按照定义的 < 运算符进行比较,则可自己加入别的比较函数例如less<KEY_TYPE>,甚至可以写一个Compare()函数并且调用。

template <class T> struct XXX : binary_function <T,T,bool> {  bool operator() (const T& x, const T& y) const  {return XXX;}
};  

至于按照value,暂时我用不到应该。

解题代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int main(){int n,temp;map<int,int>dat;map<int, int>::iterator iter;while(scanf("%d",&n)!=EOF){dat.clear();for(int i=0;i<n;i++){scanf("%d",&temp);if(dat.count(temp))dat[temp]++;elsedat[temp]=1;}for(iter = dat.begin(); iter != dat.end(); iter++) {cout<<iter->first<<" "<<iter->second<<endl;} }return 0;
}

随便说说

那天下午刚好看完map然后晚上写题目就用到了。突然兴奋。果然,多了解东西比用已经知道的东西去解决问题有用、有效率。

再来一个随便说说

看到了别的大佬更高效的方法。今晚【2017.11.25】晚上算法组讨论会上听听看,听完了晚上回来再写一个别的吧。
喵呜~

NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) 【STL-map】相关推荐

  1. NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)

    NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版) NUIST OJ 1369 2017 江苏科技大学 程序设计竞赛 B MrZ 的四因子 ...

  2. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参 ...

  3. 2017年山东省程序设计竞赛心得反思

    一.赛前训练 1.大一上学期自己一直羡慕班里在ACM集训队的同学,一直认为ACM集训队的成员都属于那种天赋异禀的天才,但当自己在504集训时,发现更多的不是ACM队员们的天赋多么异禀,更多是他们身上的 ...

  4. 2017广东工业大学程序设计竞赛决赛相关总结

    这是一直以来,自己碰到的最简单的网络赛 这么说主要是用到的高级数据结构.算法不是很多 除了一些知识盲区,还是在一些基础的问题上翻了船 但是不得不吐槽广工的OJ,前面几个题一个半小时可以出结果,后面的就 ...

  5. 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】...

    链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网题目描述 It's universally acknowledged that there're ...

  6. 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...

  7. 2017中国大学生程序设计竞赛 - 网络选拔赛 [1005 - CaoHaha's staff] 贪心

    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&cid=779 题目大意:在一个二维坐标网格里画线,可 ...

  8. 2017广东工业大学程序设计竞赛决赛(官方题解)

    题目链接:http://gdutcode.sinaapp.com/contest.php?cid=1056 Problem A: 两只老虎 正常的+有耳朵的 = a/2 正常的+有尾巴的 = b 正常 ...

  9. 2017中国大学生程序设计竞赛-哈尔滨站(2/13)

    F.Permutation 题意 给一个n,构造一个1~n的序列使得  pi ≡ 0 ( mod |pi−pi−2| ) for i=3...n 分析 直接暴力让p[i]- p[i-2]=1,先安排奇 ...

最新文章

  1. Linux命令基础--uname
  2. codeforces数学1700[CodeForces 1336B[分类讨论+二分]CodeForces - 1301C[组合计数的减法原理]]
  3. Java平均工资再次上涨!这份宝藏资料限量免费送!
  4. 轻轻的我走了,正如我轻轻的来…——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(下)...
  5. svn +nginx
  6. web访问hive速度怎么样_使用Hive的web界面:HWI
  7. 基于MATLAB的面向对象编程(5)——对象的保存(save)和载入(load)
  8. php如何实现添加到购物车_PHP实现添加购物车功能
  9. /proc/kcore失效,调试其文件系统相关模块,使重新正常工作
  10. springboot:记录jdbc
  11. C语言嵌入式系统编程修炼之内存操作
  12. JVM 之(8)虚拟机监控工具(命令)
  13. 20144303 《Java程序设计》第一周学习总结
  14. 足疗收银系统哪个好?
  15. 华为数通ensp命令(四)
  16. 入手Kindle 2
  17. sap linux 安装教程,Ubuntu Linux 下安装Sapgui740
  18. 远程服务器网刻系统,无需U盘,网络批量安装系统,pxe网刻工具
  19. WP网站主页备案号存放代码
  20. Android ADB常用指令

热门文章

  1. 未来科学大奖迎首位女性得主:密码学家王小云获百万美元奖金
  2. 行业研究报告-全球与中国吊钩市场现状及未来发展趋势
  3. 【ppt制作软件】Focusky教程 | 怎样实现表格的行列转换?
  4. Henry前端笔记之 UI组件库中table与slot相关理解
  5. Android第三方流式布局FlowLayout简单实用(搜索历史记录)
  6. php mysql 简单留言板_PHP+MySql实现一个简单的留言板
  7. 自制无线打印服务器tplink,TPLINK WR702N 改有线打印服务器 带LUCI管理页面(4M闪存 16M内存)...
  8. 计算机语言学专业排名,2019QS世界大学学科排名,澳洲语言学专业排名Top200
  9. 黑马python2019_2019最新Python黑马头条推荐系统项目
  10. 合肥工业大学——java(最新版)——第一次作业