PTA 11-散列1 电话聊天狂人 (25分)
题目地址
https://pta.patest.cn/pta/test/15/exam/4/question/722
5-14 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数NN(\le 10^5≤105),为通话记录条数。随后NN行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
链地址实现
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-07-07 14:54 正在评测 0 5-14 gcc 无 无
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 12/12 2 2
测试点2 答案正确 3/3 2 2
测试点3 答案正确 10/10 105 11 电话号码有11位,故用hash表解决
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 110000
#define ERROR -1
typedef struct UserNode * ptrUser; struct UserHashTable
{
ptrUser Head;
} gHashTable[MAXN]; struct UserNode
{
char phonenumber[20];
int count;
ptrUser next; //冲突的值用链表串起来
}; void InitHashTable()
{
int i;
for (i=0;i<MAXN;i++)
{
gHashTable[i].Head=NULL;
}
} int Hash(char *num) //取后末尾四位,以及正数第三位电话号码做hash值
{
int i=0,result;
result=(num[10]-'0')+(num[9]-'0')*10+(num[8]-'0')*100+(num[7]-'0')*1000+(num[2]-'0')*10000;
return result;
} ptrUser CreateUserNode(char *a)
{
ptrUser P;
P=malloc(sizeof(struct UserNode));
P->count=1;
P->next=NULL;
strcpy(P->phonenumber,a);
} void InsertUserToTable(ptrUser T)
{
int idx;
idx=Hash(T->phonenumber);
T->next=gHashTable[idx].Head;
gHashTable[idx].Head=T;
} ptrUser FindUser(char *num)
{
int idx;
ptrUser T;
idx=Hash(num);
T=gHashTable[idx].Head;
while(T!=NULL)
{
if(strcmp(T->phonenumber,num)==0)
return T;
T=T->next;
}
return NULL;
} void Count()
{
char maxnumber[20];
int i,maxcount=0,samecount=1;
ptrUser P;
for(i=0;i<MAXN;i++)
{
P=gHashTable[i].Head;
while(P!=NULL)
{
if(P->count > maxcount)
{
maxcount=P->count;
strcpy(maxnumber,P->phonenumber);
samecount=1;
}
else
{
if(P->count==maxcount)
samecount++;
if(P->count==maxcount && strcmp(maxnumber,P->phonenumber)>0)
{
strcpy(maxnumber,P->phonenumber);
}
} P=P->next;
} } printf("%s %d",maxnumber,maxcount);
if(samecount>1)
{
printf(" %d",samecount);
} } int main()
{
int i,N,temp;
char a[20],b[20];
ptrUser P;
scanf("%d",&N);
InitHashTable();
for(i=0;i<N;i++)
{
scanf("%s %s",a,b);
P=FindUser(a);
if(P==NULL)
{
P=CreateUserNode(a);
InsertUserToTable(P);
}
else
P->count++; P=FindUser(b);
if(P==NULL)
{
P=CreateUserNode(b);
InsertUserToTable(P);
}
else
P->count++;
}
Count(); }
PTA 11-散列1 电话聊天狂人 (25分)的更多相关文章
- PTA 5-14 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...
- 5-14 电话聊天狂人 (25分) HASH
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...
- 【PTA 天梯赛训练】电话聊天狂人(简单map)
输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出 ...
- 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 逆散列问题 (30 分)(贪心)
题目链接:https://pintia.cn/problem-sets/1107178288721649664/problems/1107178432099737614 题目大意: 给定长度为 N 的 ...
- JavaScript数据结构-11.散列
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- PTA 01-复杂度2 Maximum Subsequence Sum (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum (25分) Given ...
随机推荐
- web端 repeat和简单控件
<%@ %> - 这里面写一些声明和引用的<% %> - 编写C#代码的<%= %><%# %> Repeater - 重复器 相当于winfo ...
- UVA 1442 Cave 洞穴 (贪心+扫描)
题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...
- uoj#300.【CTSC2017】吉夫特
题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...
- UI的组织形式
UI的组织形式是树状结构: 根据层次的不同分为叶子节点和干节点. 叶子节点负责简单的信息展示. 复杂的主干复杂叶子节点的组织和整体展示. http://www.cnblogs.com/feng9exe ...
- intellij idea自定义快捷键
intellij idea自定义快捷键比较简单,自带. 首先进入idea,File-->Settings-->Live Templates. 点击右上方的“+”,第一次需要创建一个分组. ...
- js 获取当前年月日时分秒星期
$("#aa").click(function () { var date = new Date(); this.year = date.getFullYear(); this.m ...
- python_103_属性方法例子
class Flight(object): def __init__(self,name): self.flight_name = name def checking_status(self): pr ...
- 超全的BAT一线互联网公司内部面试题库
想进BAT吗?点击上方的蓝色文字关注我们后,马上 告诉你答案!! 欢迎收藏和专注本文,以后我们会陆续的整理和收集其他的公司的面试题,扩大我们的面试库,形成专栏. 这是由乐视网工程师整理的一份一线互联网 ...
- c#和Java中的抽象类
应用场景:当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法. 比如:描述一个图形.圆形. 矩形三个类.不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式 ...
- SSL免费证书申请以及nginx配置https流程记录
设置https需要ssl 证书,可以通过FreeSSL[https://freessl.org/]申请. 流程记录: 输入域名,如 http://www.youdias.xin 选择品牌,如Let's ...