11-散列1 电话聊天狂人 (25分)

来源:互联网 发布:上海一橙网络报修电话 编辑:程序博客网 时间:2024/04/30 04:15

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:

13588625832 3


代码(最后一个测试点超时了,想不到优化的方法了,如果有大神有话好了,评论区留言):

#include <iostream>#include <map>#include <set>#include <stdlib.h>#include <algorithm>using namespace std; struct person{    int cnt;    string phone;};long long stringToint(string str){    int len = str.length();    char ch[len];    for ( int i = 0 ; i < len ; i++){        ch[i] = str[i];    }    long long num = atoi(ch);    return num; } bool cmp(struct person person1,struct person person2){    if (person1.cnt > person2.cnt){        return true;    }else if (person1.cnt == person2.cnt){        long long p1 = stringToint(person1.phone);        long long p2 = stringToint(person2.phone);        if ( p1 < p2 ){            return true;        }     }    return false;}int main(){    int len;    map<string,int> map;    set<string> phone;    cin>>len;    for (int i = 0 ; i < len ; i++){        string phone1,phone2;        cin>>phone1>>phone2;        phone.insert(phone1);        phone.insert(phone2);        if ( map.count(phone1) == 0){            map.insert(pair<string,int>(phone1,1));        }else{            int cnt = map.find(phone1)->second;            cnt++;            map.erase(map.find(phone1));             map.insert(pair<string,int>(phone1,cnt));        }        if ( !map.count(phone2)){            map.insert(pair<string,int>(phone2,1));        }else{            int cnt = map.find(phone2)->second;            cnt++;            map.erase(map.find(phone2));            map.insert(pair<string,int>(phone2,cnt));        }    }    int size = phone.size();    struct person rank[size];    set<string>::iterator it = phone.begin();    int cnt = 0;    for ( ; it != phone.end() ; it++){        rank[cnt].phone = *it;        rank[cnt].cnt = map.find(rank[cnt].phone)->second;        cnt++;    }     sort(rank,rank+size,cmp);    int max = rank[0].cnt;    int index = size-1;    for ( int i = size-1 ; i > 0 ; i--){        if (rank[i].cnt != max){            index--;        }else{            break;        }    }    cout<<rank[0].phone<<" "<<max;    if( index != 0){        cout<<" "<<index+1;    }     return 0;}
原创粉丝点击