ps: 真不明白爲何水題不能一次acc++
7-14 電話聊天狂人(25 分)
給定大量手機用戶通話記錄,找出其中通話次數最多的聊天狂人。數組
輸入格式:
輸入首先給出正整數N(≤105),爲通話記錄條數。隨後N行,每行給出一條通話記錄。簡單起見,這裏只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。spa
輸出格式:
在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。若是這樣的人不惟一,則輸出狂人中最小的號碼及其通話次數,而且附加給出並列狂人的人數。code
輸入樣例:
4 13005711862 13588625832 13505711862 13088625832 13588625832 18087925832 15005713862 13588625832
輸出樣例:
13588625832 3
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+7; 4 struct T { 5 long long name;// 開始用的string 形成超時 6 int num; 7 }; 8 map < long long ,int > mp; 9 T t[2*N];// 數據開小形成段錯誤 10 int cnt; 11 int n; 12 inline void f (long long s) { 13 if (!mp[s]) { 14 mp[s]=++cnt; 15 t[cnt].name=s; 16 t[cnt].num=1; 17 } 18 else { 19 int k=mp[s]; 20 t[k].num++; 21 } 22 return ; 23 } 24 bool cmp (T a, T b) { 25 if (a.num==b.num) 26 return a.name<b.name; 27 return a.num>b.num; 28 } 29 int main () 30 { 31 scanf ("%d",&n); 32 for (int i=1;i<=n;i++) { 33 long long s1,s2; 34 scanf ("%lld %lld",&s1,&s2); 35 f(s1); 36 f(s2); 37 } 38 sort (t+1,t+1+cnt,cmp); // 記住cnt表示數組大小而不是n!!!!!!!!!! 39 int sum=1; 40 for (int i=2;i<=cnt;i++) { 41 if (t[i].num==t[1].num) sum++; 42 else break; 43 } 44 printf ("%lld %d",t[1].name,t[1].num); 45 if (sum>1) printf (" %d",sum); 46 printf ("\n"); 47 return 0; 48 }