PAT-7-14 电话聊天狂人

ps: 真不明白为何水题不能一次acc++

7-14 电话聊天狂人(25 分)

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3
 1 #include <bits/stdc++.h>
 2 using namespace std;  3 const int N=1e5+7;  4 struct T {  5     long long  name;// 开始用的string 形成超时
 6     int num;  7 };  8 map < long long ,int > mp;  9 T t[2*N];// 数据开小形成段错误
10 int cnt; 11 int n; 12 inline void f (long long s) { 13     if (!mp[s]) { 14             mp[s]=++cnt; 15             t[cnt].name=s; 16             t[cnt].num=1; 17  } 18         else { 19             int k=mp[s]; 20             t[k].num++; 21  } 22     return ; 23 } 24 bool cmp (T a, T b) { 25     if (a.num==b.num) 26         return a.name<b.name; 27     return a.num>b.num; 28 } 29 int main () 30 { 31     scanf ("%d",&n); 32     for (int i=1;i<=n;i++) { 33         long long s1,s2; 34         scanf ("%lld %lld",&s1,&s2); 35  f(s1); 36  f(s2); 37  } 38     sort (t+1,t+1+cnt,cmp); // 记住cnt表示数组大小而不是n!!!!!!!!!!
39     int sum=1; 40     for (int i=2;i<=cnt;i++) { 41         if (t[i].num==t[1].num) sum++; 42         else                    break; 43  } 44     printf ("%lld %d",t[1].name,t[1].num); 45     if (sum>1) printf (" %d",sum); 46     printf ("\n"); 47     return 0; 48 }
相关文章
相关标签/搜索