ps: 真不明白为什么水题不能一次ac
7-14 电话聊天狂人(25 分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
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 }
抓住青春的尾巴。。。