给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数NN(\le 10^5≤10?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
时间: 2024-10-02 03:14:34