11-散列1 电话聊天狂人(25 分)
11-散列1 电话聊天狂人(25 分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
思路:一道简单的散列表。取最后5位作为key,冲突时链表插入,相等时计数器加1。
代码:
#include<stdio.h>
#include<string>
long long max = 0, people = 0, id = -1;
struct node {long long date;long long count;struct node *next;
};
typedef struct node * List;
struct hashtable {long long table;List * list;
};
typedef struct hashtable * hash;
typedef struct node * position;
long long nextprime(long long n)
{long long i, j;for (i = n + 1;; i++){for (j = 2; j < i / 2; j++)if (!(i%j)) break;if (j == i / 2) return i;}
}
hash create(long long n)
{hash h = (hash)malloc(sizeof(hashtable));h->table = nextprime(n);h->list = (List *)malloc(sizeof(node)*(int)h->table);for (long long i = 0; i < h->table; i++){h->list[i] = (List)malloc(sizeof(node));h->list[i]->count = 0;h->list[i]->date = 0;h->list[i]->next = NULL;}return h;
}
void insert(hash h, long long key)
{long long k = key % h->table;position p = h->list[k]->next;while (p){if (p->date == key) break;p = p->next;}if (!p){p = (position)malloc(sizeof(node));p->date = key;p->count = 1;p->next = h->list[k]->next;h->list[k]->next = p;}else p->count++;if (p->count > max) {max = p->count;people = 1;id = p->date;}else if (p->count == max) {if (id == -1) id = key;else if (id > key) id = key;people++;}
}
void searchAndOut(hash h)
{if (people == 1) printf("%lld %lld\n", id, max);else printf("%lld %lld %lld\n", id, max, people);
}
int main()
{long long n, a, b;scanf("%lld", &n);hash h = create(2 * n);for (long long i = 0; i < n; i++){scanf("%lld %lld", &a, &b);insert(h, a);insert(h, b);}searchAndOut(h);
}
结尾:本来直接想把散列表定义拷上去的,但是学校网站进不去了。于是准备手撸一个,结果一路顺畅 (*^▽^*)
交上去以后最后一个测试点过不去,很郁闷,查了半个多小时才发现 把'>' 写成 ‘<’ (╯‵□′)╯︵┻━┻
现在想想完全可以定义一个struct node,然后用vector实现……下次有空试试
转载于:https://www.cnblogs.com/childwang/p/8280276.html
11-散列1 电话聊天狂人(25 分)相关推荐
- 11-散列1 电话聊天狂人 (25 分) (C语言)
浙大版<C语言程序设计实验与习题指导(第3版)>题目集 11-散列1 电话聊天狂人 (25 分) 二.题解 c代码 11-散列1 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出 ...
- 11-散列1 电话聊天狂人 (25 分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的 ...
- 11-散列1 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 ^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位 ...
- 7-14 电话聊天狂人 (25 分)map做法 + 详解 + 思路分析
7-14 电话聊天狂人 (25 分)map做法 1:题目 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 5 ),为通话记录条数.随后N行 ...
- 7-3 电话聊天狂人 (25 分)
暑假字符串专题HBU程序设计训练营总结 ?点这里 7-3 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为 ...
- 7-1 电话聊天狂人 (25分) PTA 数据结构
7-1 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 5 ),为通话记录条数.随后N行,每行给出一条通话记录. ...
- 5-14 电话聊天狂人 (25分)/PTA
5-14 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每 ...
- 5-14 电话聊天狂人 (25分)
5-14 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105≤ 10^5),为通话记录条数.随后N行,每行给出一条通话 ...
- 算法 散列1 电话聊天狂人
全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案 题目:给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105), ...
- 电话聊天狂人 (25 分)【简便解法】
立志用最少的代码做最高效的表达 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这 ...
最新文章
- java.utilDate和java.sql.Date
- 丑憨批的爬虫笔记3(实例)
- Amazon:大数据分析技能,你满足几条?
- Kafka单机、集群模式安装详解(二)
- compiz把xfce4系统搞崩溃后的恢复方案
- iphone android传照片大小,iPhone与安卓跨平台如何传照片图文教程
- cad pu插件下载lisp_CAD自动编号lisp插件下载
- 2015/8/7 卖出中国软件,卖早了;5只不同形态的三角形震荡股票
- 华容道与数据结构 (续 3)
- Ubuntu 15.04 Gogs(git 版本库) 二进制安装
- 基于HTML5+CSS制作 H5移动端电商购物网页设计35页面(包括主页,商品详情,转账,付款,购物车等页面) 功能齐全...
- 计算机怎么格式化电脑吗,怎么格式化电脑
- Alpha测试 / Beta测试 / 黑盒测试 /白盒测试概述
- promox VE各版本ISO下载及安装教程
- VMware 14 Pro 虚拟机下CentOS 7操作系统安装教程
- html p标签的补白,padding css内补白padding教程
- 如何看待侵权行为?有存在的合理性吗?
- LCD fb driver for linux 参数计算
- 怎样才能保证单元测试效果
- 博士之死背后异化的师生关系