7-14 电话聊天狂人(25 分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤10?5??),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
思路:使用结构体数组来存取,每次输入查找数组中是否存在,不存在则插入,否则个数加一,但是当N最大且随机时,运行超时。
明天改成vector试试。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; struct Node{ long long numb; int n; }a[200005]; bool cmp(Node a, Node b) { return a.n > b.n; } int main() { int n, sum = 0; cin >> n; for (int i = 0; i < n; i++) { long long numb1, numb2; cin >> numb1 >> numb2; int flag = 1; for (int i = 0; i < sum;i++) if (a[i].numb == numb1){ a[i].n++; flag = 0; break; } if (flag){ a[sum].numb = numb1; a[sum].n = 1; sum++; } flag = 1; for (int i = 0; i < sum; i++) if (a[i].numb == numb2){ a[i].n++; flag = 0; break; } if (flag){ a[sum].numb = numb2; a[sum].n = 1; sum++; } } sort(a, a + sum, cmp); int flag = 1; long long min = a[0].numb; for (int i = 1; i < sum; i++) { if (a[i].n != a[0].n)break; flag++; if (a[i].numb < min)min = a[i].numb; } if (flag == 1)cout << a[0].numb << " " << a[0].n << endl; else cout << min << " " << a[0].n << " " << flag << endl; return 0; }
http://blog.csdn.net/duan19920101/article/details/50617190/