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

输入格式:

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

输出格式:

在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。

输入样例:

  1. 4
  2. 13005711862 13588625832
  3. 13505711862 13088625832
  4. 13588625832 18087925832
  5. 15005713862 13588625832

输出样例:

  1. 13588625832 3
  1. /*
  2. * 就这道题而言:如果采取直接电话号码长度为11 直接排序O(11 * n * log n ) 然后在找出现最多的O(11 * n) 时间效率比采用散列表还要好点- -
  3. 1.上述方案在实际应用中不可行 应为会涉及到不断插入新号码的问题 每插入一个新号码都要重新进行排序。
  4. 可以考虑用散列表解决 这题哈希函数采用除留余数法 解决冲突采用分离链接法。
  5. */
  6. #include "iostream"
  7. #include "cmath"
  8. #include "cstring"
  9. using namespace std;
  10. #define KEYLENGTH 11
  11. typedef char ElementType[KEYLENGTH];
  12. typedef int Index; /* 散列地址类型 */
  13.  
  14. struct LNode {
  15. ElementType data;
  16. LNode* next;
  17. int count;
  18. };
  19. typedef LNode *ptrToLNode;
  20. typedef ptrToLNode Position;
  21. typedef ptrToLNode List;
  22. typedef struct TblNode* HashTable;
  23. struct TblNode { /* 散列表节点定义 */
  24. int tableSize; /* 表的大小 */
  25. List heads; /* 指向链表头结点的数组 */
  26. };
  27. #define MAXTABLESIZE 1000000
  28. int nextPrime(int n) {
  29. int i, p = (n % ) ? n + : n + ;
  30. while (p < MAXTABLESIZE) {
  31. for (i = sqrt(p); i > ; i--)
  32. if (!(p%i))
  33. break;
  34. if (i == )
  35. break;
  36. else
  37. p += ;
  38. }
  39. return p;
  40. }
  41. HashTable createTable(int tableSize) {
  42. HashTable h;
  43. int i;
  44. h = (HashTable)malloc(sizeof(struct TblNode));
  45. h->tableSize = nextPrime(tableSize);
  46. h->heads = (List)malloc(h->tableSize* sizeof(struct LNode));
  47. for (i = ; i < h->tableSize; i++) {
  48. h->heads[i].data[] = '\0'; h->heads[i].next = NULL;
  49. h->heads[i].count = ;
  50. }
  51. return h;
  52. }
  53.  
  54. int Hash(int p, int tableSize) { /* 设置映射的哈希函数 */
  55. return p % tableSize; /* 采用除留余数法 */
  56. }
  57.  
  58. Position find(HashTable h , ElementType key) {
  59. Position p;
  60. Index pos;
  61. pos = Hash(atoi(key+KEYLENGTH-),h->tableSize); /* 初始散列位置 */
  62. p = h->heads[pos].next; /* 从该链表的第一个节点开始 */
  63. while (p && strcmp(p->data, key)) /* 未到表尾 并且key未找到时 */
  64. p = p->next;
  65. return p;
  66. }
  67.  
  68. bool insert(HashTable h, ElementType key) {
  69. Position p, newCell;
  70. Index pos;
  71. p = find(h, key);
  72. if (!p) {
  73. newCell = (Position)malloc(sizeof(struct LNode));
  74. strcpy(newCell->data, key);
  75. newCell->count = ;
  76. pos = Hash(atoi(key + KEYLENGTH - ), h->tableSize); /* 初始散列位置 */
  77. /* 头插法 将newCell作为h->heads[pos]的第一个结点 */
  78. newCell->next = h->heads[pos].next;
  79. h->heads[pos].next = newCell;
  80. return true;
  81. }
  82. else {
  83. p->count++;
  84. return false;
  85. }
  86. }
  87.  
  88. void scanAndOutput(HashTable h) {
  89. int i, MaxCnt, PCnt;
  90. MaxCnt = PCnt = ;
  91. ElementType MinPhone;
  92. List ptr;
  93. MinPhone[] = '\0';
  94. for (i = ; i < h->tableSize; i++) {
  95. ptr = h->heads[i].next;
  96. while (ptr) {
  97. if (ptr->count > MaxCnt) {
  98. MaxCnt = ptr->count;
  99. strcpy(MinPhone, ptr->data);
  100. PCnt = ;
  101. }
  102. else if (ptr->count == MaxCnt) {
  103. PCnt++;
  104. if (strcmp(MinPhone, ptr->data) > )
  105. strcpy(MinPhone, ptr->data);
  106. }
  107. ptr = ptr->next;
  108. }
  109. }
  110. cout << MinPhone << " "<< MaxCnt ;
  111. if (PCnt > )
  112. cout << " "<<PCnt;
  113. cout << endl;
  114. }
  115.  
  116. void destroyTable(HashTable h) {
  117. int i;
  118. Position p, temp;
  119. for (i = ; i < h->tableSize; i++) {
  120. p = h->heads[i].next;
  121. while (p != NULL) {
  122. temp = p->next;
  123. free(p);
  124. p = temp;
  125. }
  126. }
  127. free(h->heads);
  128. free(h);
  129. }
  130. int main() {
  131. int n, i;
  132. ElementType key;
  133. cin >> n;
  134. HashTable h = createTable( * n);
  135. for (i = ; i < n; i++) {
  136. cin >> key; insert(h, key);
  137. cin >> key; insert(h, key);
  138. }
  139. scanAndOutput(h);
  140. destroyTable(h);
  141. return ;
  142. }

PTA 5-14 电话聊天狂人 (25分)的更多相关文章

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

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

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

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数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甲级1094 The Largest Generation (25分)

    PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...

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

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

  8. PTA 10-排序5 PAT Judge (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PA ...

  9. PTA 05-树7 堆中的路径 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径   (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...

随机推荐

  1. 在其他的电脑上配置绿色Jre+tomcat运行环境

    其他的同事要使用我们的web程序(基于tomcat的web程序).所以要求是对方的电脑任何程序都不需要安装,把我们的包拷贝过去,直接执行批处理就可以运行. 经过了一番摸索,实现方式如下: 1,准备jr ...

  2. Qt: 访问容器(三种方法,加上for循环就四种了)good

    #include <iostream>#include <QString>#include <QList>#include <QListIterator> ...

  3. 【今日推荐】10大流行的 Metro UI 风格的 Bootstrap 主题和模板

    1. BootMetro 基于 Twitter Bootstrap 的简单灵活的 HTML.CSS 和 Javascript 框架,Win8 风格,大爱啊! 立即下载     效果演示 2. Boot ...

  4. 区分jquery中的offset和position

    一次又一次地碰到需要获取元素位置的问题, 然后一次又一次地查offset和position的区别. 忍不了了, 这次一定得想办法记下来. position是元素相对于父元素的位置. 这个好记, par ...

  5. latex 写作

    一.下载:http://www.ctex.org/CTeXDownload 二.bst文件的作用 在tex文件调用bib时,如 \bibliographystyle{Science} \bibliog ...

  6. 【转】Android Service被关闭后自动重启,解决被异常kill 服务

    http://www.kaifajie.cn/android/10182-2.html 每次调用startService(Intent)的时候,都会调用该Service对象的onStartComman ...

  7. 【HDOJ】4358 Boring counting

    基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...

  8. 12月上旬poj其他题

    poj3170 1,4两遍bfs: poj3171 改一改poj2376即可 poj3172 dfs+剪枝 其实增长速度很快,n<=40,题目吓你的: poj3661 比较经典的dp:设f[i, ...

  9. oracle导入到Excel

    一.从oracle到处数据到excel文件方法一.直接从PL/SQL中,全选数据,然后复制粘贴到excel中: 方法二.同样是通过PL/SQL,在数据列中,点击右键-->导出结果-->选择 ...

  10. Android学习系列(1)--为App签名(为apk签名)

    写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签 ...