给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:

输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数。随后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的更多相关文章

  1. PTA 11-散列1 电话聊天狂人 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/722 5-14 电话聊天狂人   (25分) 给定大量手机用户通话记录,找出其中通话次数 ...

  2. PTA 5-14 电话聊天狂人 (25分)

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...

  3. 7-14 电话聊天狂人(25 分)(Hash表基本操作)

    7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...

  4. PAT-7-14 电话聊天狂人

    ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条 ...

  5. 电话聊天狂人 【STL】

    7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...

  6. 【PTA 天梯赛训练】电话聊天狂人(简单map)

    输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出 ...

  7. 5-15 QQ帐户的申请与登陆 (25分) HASH

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数NN(\le 10^5≤10​5​​),随后给出NN行指令.每行指令的格 ...

  8. 5-45 航空公司VIP客户查询 (25分) HASH

    不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...

  9. L2-001 紧急救援 (25 分)

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

随机推荐

  1. Oracle虚拟机配置

    1.正常安装 .配置 3.监听配置 4.重启监听服务 5.防火墙端口放行 6.Oracle客户端连接工具测试

  2. redis实际项目作用

    我整理一下redis主要在项目作用,只是我接触到的 1  手机验证码存入redis中,可以限制什么时候有效 2 防止接口请求频率过高,例如一分钟只能请求5次 代码如下: <?php /** * ...

  3. Enumerable.Union<TSource> 方法

    功能:生成两个序列的并集(使用默认的相等比较器). 命名空间: System.Linq 程序集: System.Core.dll 备注:实现此方法时使用了延迟执行. 它直接返回一个对象,该对象存储了执 ...

  4. 一个Velocity Template Language学习的框架

    Velocity Template Language(VTL)使得数据展示和后台代码的开发分离开来,最初用在基于servlet的网站开发上,它的这一特性使得它在应付MVC Web开发模式时显得尤其合适 ...

  5. Python 设计模式--策略模式

    策略模式(Strategy Pattern) 策略模式是一种与行为相关的设计模式,允许你在运行时根据指定的上下文确定程序的动作.可以在两个类中封装不同的算法,并且在程序运行时确定到底执行哪中策略. 特 ...

  6. poj1787 Charlie's Change

    思路: 完全背包,记录路径. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ] ...

  7. Font Awesome 图标使用总结

    参考 http://fontawesome.dashgame.com/ 1 大图标递进  fa-lg (33%递增).fa-2x. fa-3x.fa-4x,或者 fa-5x  2 固定宽度  fa-f ...

  8. Elasticsearch--扩展索引结构

    目录 索引树形数据 索引非扁平数据 索引关系型数据 使用嵌套对象 评分与嵌套查询 使用主从关系 索引树形数据 使用path_analyzer分析树形数据字段 索引非扁平数据 数据如下: { " ...

  9. sublime 自定义快捷键

    [ { "keys": ["alt+space"], "command": "auto_complete" }, // ...

  10. tensorboard在windows系统浏览器显示空白的解决

    一个简单的using_tensorboard.py程序,如下: #using_tensorboard.py import tensorflow as tf a = tf.constant(10,nam ...