PTA 数据结构与算法题目集(中文) 7-14 电话聊天狂人(25 分)map实现

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

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

 本题其实是用散列表来做,结果偷了个懒,直接用现有的map容器做的。。。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
int n;
map<long long int ,int>mapp;
int main()
{
    scanf("%d",&n);
    int maxx=-1; //记录电话狂人的打电话数目
    for (int i=0;i<n;i++)
    {
        long long int a,b;
        scanf("%lld%lld",&a,&b);
        mapp[a]++; mapp[b]++;
        maxx=max(maxx,max(mapp[b],mapp[a]));
    }
    int flag=0; //记录相同电话狂人的个数
    long long int temp=1300571186211;
    for (map<long long int,int> ::iterator it=mapp.begin();it!=mapp.end();it++)
        if(it->second==maxx)
        {
            flag++;
            if(it->first<temp)
                temp=it->first;
        }
    if(flag==1)
    printf("%lld %d\n",temp,maxx);
    else
    printf("%lld %d %d\n",temp,maxx,flag);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/81944716