电话聊天狂人

 电话聊天狂人

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

set的使用让我提高了很多,虽然不是很完美的代码,慢慢写吧

#include<iostream>
#include<map>
#include<set>
using namespace std;
map<long long,int>x;//用long long代替string,提高效率
set<long long>t;
int main()
{
    long long a,b,min;
    int n,k=1;
    cin>>n;
    cin>>a>>b;
    t.insert(a);//把a放入set中
    t.insert(b);
    x[a]=1;
    x[b]=1;
    if(a>b) min=a;
    else min=b;
    while(--n)
    {
        cin>>a>>b;
        x[a]++;
        x[b]++;
        if(x[a]>x[min])
        {
            min=a;
            k=1;
            t.clear();
            t.insert(min);//先把set清空,再把min放入,防止电话号码的重复
        }
        else if(x[a]==x[min]&&!t.count(a))
        {
            t.insert(a);
            k++;
            if(a<min) min=a;
        }
        if(x[b]>x[min])
        {
            min=b;
            k=1;
            t.clear();
            t.insert(min);
        }
        else if(x[b]==x[min]&&!t.count(b))
        {
            t.insert(b);
            k++;
            if(b<min) min=b;
        }
    }
    if(k>1) cout<<min<<" "<<x[min]<<" "<<k<<endl;
    else cout<<min<<" "<<x[min]<<endl;
}

 

posted @ 2018-03-13 21:52  myyismyy  阅读(200)  评论(0编辑  收藏  举报