首页 > 代码库 > 5-14 电话聊天狂人 (25分)

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

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3
搜索树程序:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long LL;
typedef struct Treenode
{
    LL str;
    int cnt;
    struct Treenode* left;
    struct Treenode* right;
}Treenode,*Tree;
Tree Newnode(LL s)
{
    Tree t = (Tree)malloc(sizeof(Treenode));
    t->str = s;
    t->cnt = 1;
    t->left = NULL;
    t->right = NULL;
    return t;
}
Tree Insert(Tree T,LL s)
{
    if(!T)
        T = Newnode(s);
    else if(T->str>s)
        T->left = Insert(T->left,s);
    else if(T->str<s)
        T->right = Insert(T->right,s);
    else
        T->cnt = T->cnt+1;
    return T;
}
void find(Tree T,LL &mins,int &maxt,int &same)
{
    if(T)
    {
        if(T->cnt > maxt)
        {
            maxt = T->cnt;
            mins = T->str;
            same = 1;
        }
        else if((T->cnt==maxt))
        {
            if(T->str<mins)
                mins = T->str;
            same++;
        }
        find(T->left,mins,maxt,same);
        find(T->right,mins,maxt,same);
    }
}
int main()
{
    int n;
    LL t1;
    Tree T;
    cin>>n;
    cin>>t1;
    T =Newnode(t1);
    for(int i=1;i<2*n;i++)
    {
        cin>>t1;
        T = Insert(T,t1);
    }
    LL ms=0;
    int mt=0,num=0;
    find(T,ms,mt,num);
    cout<<ms<< <<mt;
    if(num>1)
        cout<< <<num<<endl;
    else
        cout<<endl;
    return 0;
}

 

这题一开始用map超时,然后我试了试二叉搜索树,也无情超时,看来必须用hash

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