PAT 7-14 电话聊天狂人
问题描述
问题描述
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例
13588625832 3
解题思路
本题为统计每个电话号码出现的次数,并且输出出现最多的那个号码和出现次数,如果这样的号码不唯一,输出一共有多少个并列。
一开始我使用了结构体,存储出现的号码和次数,在存储完毕后按照出现次数和号码字典序进行排序。那么第一个号码一定是要求输出的号码和次数,如果下一个的号码出现次数与这个相等,说明有并列,直到不相等时,输出并列个数。结构体计算容易导致超时,最后一个测试点没有通过。代码如下:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct per
{string num;int count=0;
};
bool cmp(per a,per b)
{if(a.count!=b.count) return a.count>b.count;else return a.num<b.num;
}
int main()
{int n;cin>>n;string str1;vector<per> v;per no;int pp=1;for(int i=0;i<n;i++){ int c=2;while(c--){cin>>str1;bool flag=0;int j;for(j=0;j<v.size();j++)if(v[j].num==str1){v[j].count++;flag=1;} if(flag==0) {no.num=str1;no.count=1;v.push_back(no);} } }sort(v.begin(),v.end(),cmp);cout<<v[0].num<<" "<<v[0].count;for(int i=1;i<v.size();i++){if(v[i].count==v[i-1].count)pp++;else{ if(pp!=1) cout<<" "<<pp;break;}}return 0;
}
题目中的关键字为电话号码,值为出现次数。应该使用map计数。在输入号码的同时计算出出现最多次的次数,最后遍历map,因为map默认对key值进行从小到大的排序,因此第一个出现的value值为最大值的号码一定为题目要求的号码,并对最大值统计出现次数。
解题代码
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{int n,mmax=0;cin>>n;string s;string maxs;map<string ,int> m;for(int i=0;i<2*n;i++){cin>>s;m[s]++;if(mmax<m[s])mmax=m[s]; }map<string,int> ::iterator it;int cnt=0;//map默认为key值从小到大排序 ,所以第一个最多电话的人就是号码最小的人 for(it=m.begin();it!=m.end();it++)if(it->second==mmax){cnt++;if(maxs=="")maxs=it->first; } cout<<maxs<<" "<<mmax;if(cnt!=1) cout<<" "<<cnt;return 0;
}
PAT 7-14 电话聊天狂人相关推荐
- PAT 电话聊天狂人
看到一个人的解题思路,学到了他的算时间的一种方法,特记录一下 11-散列1 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N( ...
- 7-14 电话聊天狂人 (25 分)map做法 + 详解 + 思路分析
7-14 电话聊天狂人 (25 分)map做法 1:题目 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 5 ),为通话记录条数.随后N行 ...
- 7-20 电话聊天狂人(25 分)(Hash模板)
7-20 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...
- PTA 电话聊天狂人 思路分析及代码解析
PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...
- 电话聊天狂人(java)
7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...
- (C语言详解)11-散列1 电话聊天狂人(小白实现详细解释)
本博文源于浙江大学<数据结构>.电话聊天狂人是非常有趣的一道题.姥姥在小白专场里从main函数搭建.重要函数编写.模块的改变与裁剪非常仔细的说明,下面就给出详细指导: 博主在前篇博文已经将 ...
- 7-3 电话聊天狂人 (25 分)
暑假字符串专题HBU程序设计训练营总结 ?点这里 7-3 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为 ...
- 7-1 电话聊天狂人 (25分) PTA 数据结构
7-1 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 5 ),为通话记录条数.随后N行,每行给出一条通话记录. ...
- 数据结构PTA 基础实验5-2.2 电话聊天狂人
基础实验5-2.2 电话聊天狂人 题目 解法 题目 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通 ...
- 5-20 电话聊天狂人
5-20 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每 ...
最新文章
- 电信设备产品简介材料收集
- python培训班有用吗-比起自学Python,参加Python培训班有什么优势?
- linux(gentoo)安装配置conky
- ARC068C - Snuke Line
- java cpu 内存使用情况_java高cpu占用和高内存占用问题排查 (转)
- 为什么派生的子类报错不能实例化抽象类_一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别...
- 局域网访问提示无法访问检查拼写_关于海康视频监控异地访问设置一些细节的说明...
- C++ Primer Plus 读书笔记(第8、9章)
- 一起来学Masonry (一)
- CF 570D. Tree Requests [dsu on tree]
- android - Unable to add window -- token null is not for an application的解决方案
- 凸优化第八章几何问题 8.5 中心
- LightOJ 1419 – Necklace 用m个颜色去涂n个球(环状) 要求相邻可同色
- IDEA修改背景颜色大全(护眼绿等)
- 【历史上的今天】4 月 27 日:Tumblr 上线;施乐推出了 Star 工作站;第一台安德伍德打字机诞生
- 如何保护自己的颈椎?
- Qt多功能计算器(一)——基本功能
- 时间Date类型如何比较大小
- apikey、apisecret在api请求中的使用
- JAVA技术及其应用实验三(抽象类和匿名类)