输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
#include<bits/stdc++.h>
#include<string>
#include<map>
using namespace std;
map<string,int>p;
struct nu
{
string num;//存电话号码
int cnt;
}ang[1000010];
bool cmp_cnt(nu x,nu y)
{
return x.cnt>y.cnt;//按照打电话次数排序
}
bool cmp_num(nu x,nu y)
{
return x.num<y.num;//按照电话号码的大小排序
}
int main()
{
string str,ch;
int n,k=0,amax=0,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
cin>>str>>ch;//输入两串电话号码
if(p[str]==0)
ang[k++].num=str;
//分别存入
if(p[ch]==0)
ang[k++].num=ch;
p[str]++;//用map记录通话次数
p[ch]++;
}
for(i=0;i<k;i++)
{
ang[i].cnt=p[ang[i].num];//提取通话次数
}
sort(ang,ang+k,cmp_cnt);
amax=ang[0].cnt;
int t=1;
for(i=1;;i++)//寻找并列
{
if(amax==ang[i].cnt)
t++;
else
break;
}
sort(ang,ang+t,cmp_num);
cout<<ang[0].num<<" "<<ang[0].cnt;
if(t>1)
cout<<" "<<t;
return 0;
}