5-14 电话聊天狂人 (25分) HASH
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数NN(\le 10^5≤105),为通话记录条数。随后NN行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long LL;
typedef struct Treenode
{
LL str;
int cnt;
struct Treenode* left;
struct Treenode* right;
}Treenode,*Tree;
Tree Newnode(LL s)
{
Tree t = (Tree)malloc(sizeof(Treenode));
t->str = s;
t->cnt = ;
t->left = NULL;
t->right = NULL;
return t;
}
Tree Insert(Tree T,LL s)
{
if(!T)
T = Newnode(s);
else if(T->str>s)
T->left = Insert(T->left,s);
else if(T->str<s)
T->right = Insert(T->right,s);
else
T->cnt = T->cnt+;
return T;
}
void find(Tree T,LL &mins,int &maxt,int &same)
{
if(T)
{
if(T->cnt > maxt)
{
maxt = T->cnt;
mins = T->str;
same = ;
}
else if((T->cnt==maxt))
{
if(T->str<mins)
mins = T->str;
same++;
}
find(T->left,mins,maxt,same);
find(T->right,mins,maxt,same);
}
}
int main()
{
int n;
LL t1;
Tree T;
cin>>n;
cin>>t1;
T =Newnode(t1);
for(int i=;i<*n;i++)
{
cin>>t1;
T = Insert(T,t1);
}
LL ms=;
int mt=,num=;
find(T,ms,mt,num);
cout<<ms<<' '<<mt;
if(num>)
cout<<' '<<num<<endl;
else
cout<<endl;
return ;
}
hash程序
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
/*
Hash表的使用方法//hash表size一般是大于N的第一个素数
1.嵌套定义结构体 注意在hashtable 中定义的是一个指向指针的指针(指向list结构体的指针列表)
初始化时注意分配空间!
所以在给Hshlist分配空间的时候,要注意,(list*)malloc(sizeof(list))这样才对!
2.确定hash函数,在这里使用atoi把字符串转变为数字然后对哈希表size取余数.
3.插入操作,查找操作
列表元素第一个是头节点,应该从它的next元素开始遍历
通过hash函数找到对应的在list中的位置,然后在该位置中查找元素,如果存在就计数,不存在就在列表头
加入元素.
4.destroy操作,分别对应Init一一释放空间
*/
typedef struct Listnode *Pos;
typedef struct Listnode
{
char Phonenum[];
int cnt;
Pos next;
}*List;
typedef struct Hashtable
{
int tablesize;
List *Thelist;
} *HashTable; int Hash(int key,int size)
{
return key%size;
}
void Insert(char key[],HashTable H);
Pos Find(char key[],HashTable H);
HashTable Init(int size);
void destroy(HashTable H);
void FindMax(HashTable H);
int NextPrime(int x);
int main()
{
int n;
scanf("%d",&n);
HashTable H = Init(*n);
char from[],to[];
for(int i=;i<n;i++)
{
scanf("%s%s",from,to);
Insert(from,H);
Insert(to,H);
}
FindMax(H);
destroy(H);
}
int NextPrime(int x)
{
int i,j;
for(i=x;;i++)
{
for(j=;j*j<=i;j++)
if(i%j==)
break;
if(j*j>i)
return i;
}
}
HashTable Init(int size)
{
int Tsize = NextPrime(size);
HashTable H = (HashTable)malloc(sizeof(Hashtable));
H->tablesize = Tsize;
H->Thelist = (List*)malloc(sizeof(List)*Tsize);
for(int i=;i<Tsize;i++)
{
H->Thelist[i] = (List)malloc(sizeof(Listnode));
H->Thelist[i]->next = NULL;
}
return H;
} void Insert(char key[],HashTable H)
{
Pos p,tmp;
List t = H->Thelist[Hash(atoi(key+),H->tablesize)];
p = Find(key,H);
if(p==NULL)
{
tmp = (List)malloc(sizeof(Listnode));
tmp->cnt = ;
strcpy(tmp->Phonenum,key);
tmp->next = t->next;
t->next = tmp;
}
else
(p->cnt)++;
} Pos Find(char key[],HashTable H)
{
List t = H->Thelist[Hash(atoi(key+),H->tablesize)];
List p = t->next;
while(p!=NULL&&strcmp(p->Phonenum,key))
p = p->next;
return p;
} void destroy(HashTable H)
{
for(int i=;i< H->tablesize;i++)
{
free(H->Thelist[i]);
}
free(H->Thelist);
free(H);
} void FindMax(HashTable H)
{
char MinPhone[];
int max = -,same = ;
for(int i=;i<H->tablesize;i++)
{
List t = H->Thelist[i];
t = t->next;
while(t!=NULL)
{
if( t->cnt > max)
{
max = t->cnt;
strcpy(MinPhone,t->Phonenum);
same = ;
}
else if(t->cnt == max)
{
if(strcmp(MinPhone,t->Phonenum)>)
strcpy(MinPhone,t->Phonenum);
same++;
}
t =t->next;
}
}
printf("%s %d", MinPhone, max);
if (same > )
printf(" %d", same);
}
这题一开始用map超时,然后我试了试二叉搜索树,也无情超时,看来必须用hash
5-14 电话聊天狂人 (25分) HASH的更多相关文章
- PTA 11-散列1 电话聊天狂人 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/722 5-14 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数 ...
- PTA 5-14 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...
- 7-14 电话聊天狂人(25 分)(Hash表基本操作)
7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...
- PAT-7-14 电话聊天狂人
ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条 ...
- 电话聊天狂人 【STL】
7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...
- 【PTA 天梯赛训练】电话聊天狂人(简单map)
输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出 ...
- 5-15 QQ帐户的申请与登陆 (25分) HASH
实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数NN(\le 10^5≤105),随后给出NN行指令.每行指令的格 ...
- 5-45 航空公司VIP客户查询 (25分) HASH
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...
- L2-001 紧急救援 (25 分)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
随机推荐
- 指向“”的 script 加载失败
今天遇到了一个非常奇怪的问题:在某个同时的电脑上,所有浏览器无法打开某个页面,F12查看控制台,发现有一个黄色的 指向“xxxx.js”的 <script> 加载失败 的提示.该外部js文 ...
- 402 Remove K Digits 移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小.注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零.示例 1 :输入: ...
- 网站开发综合技术 第二部分 CSS样式表
第2部分 CSS样式表 CSS(Cascading Style Sheets,层叠样式表),作用是美化HTML网页. /*注释*/ 注释语法 2.1.样式表的基本概念 2.1.1.样式表分类 1 ...
- Objective-C设计模式——生成器Builder(对象创建)
生成器 生成器,也成为建造者模式,同样是创建对象时的设计模式.该模式下有一个Director(指挥者),客户端知道该类引用用来创建产品.还有一个Builder(建造者),建造者知道具体创建对象的细节. ...
- vue2.0之60s验证码发送
快速的说下我的60s经历不管移动还是pc端的登录都需要发送验证信息,那么我们熟悉的那个验证按钮就不可少了.首先,我们都知道的一些基本功能.1.验证账号输入的格式正确与否(减少传递基本的错误信息)2.@ ...
- python自动化--语言基础三字典、函数、全局/局部变量
字典 dict1 = {,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values()) #打印所有的values值 pri ...
- [算法天天练] - C语言实现双向链表(一)
双向链表是比较常见的,主要是在链表的基础上添加prev指针,闲话少说直接上代码吧(这个也是网上一个大神的思路,真心不错,条理清楚,逻辑缜密) 主要也是为了学习,贴上我所调试成功的代码(Linux环境下 ...
- Learning Face Age Progression: A Pyramid Architecture of GANs
前言 作为IP模式识别的CNN初始模型是作为单纯判别式-模式识别存在的,并以此为基本模型扩展到各个方向.基本功能为图像判别模型,此后基于Loc+CNN的检测模型-分离式.end2end.以及MaskC ...
- CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度
1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...
- Redis系列(九)--几道面试题
这里只是一点面试题,想了解更多,可以查看本人的Redis系列:https://www.cnblogs.com/huigelaile/category/1461895.html 1.Redis和Memc ...