仿win8网站模板,固安县住房和城乡建设局网站,买空间送网站,海北网站建设7-14 电话聊天狂人 (25 分)map做法
1#xff1a;题目
给定大量手机用户通话记录#xff0c;找出其中通话次数最多的聊天狂人。
输入格式: 输入首先给出正整数N#xff08;≤10 5 #xff09;#xff0c;为通话记录条数。随后N行#xff0c;每行给出一条通话记录…7-14 电话聊天狂人 (25 分)map做法
1题目
给定大量手机用户通话记录找出其中通话次数最多的聊天狂人。
输入格式: 输入首先给出正整数N≤10 5 为通话记录条数。随后N行每行给出一条通话记录。简单起见这里只列出拨出方和接收方的11位数字构成的手机号码其中以空格分隔。
输出格式: 在一行中给出聊天狂人的手机号码及其通话次数其间以空格分隔。如果这样的人不唯一则输出狂人中最小的号码及其通话次数并且附加给出并列狂人的人数。
输入样例: 4 13005711862 13588625832 13505711862 13088625832 13588625832 18087925832 15005713862 13588625832 输出样例: 13588625832 3
2思路分析
来看码的同学呀 一定要去学一下map容器刷题刷到没用过的知识并且挺重要的就赶紧去学 用了map 容器 其实就没啥思路可分析的 这个容器太牛逼存数据时已经将重复的元素个数累加好了 即最终状态是一个号码 对应一个 通话次数 但要注意的题目给的要求 如果有相同号码时需要比较大小 我纠结了半天想这一串数字字符串怎么比较大小呀 但自己敲了个demo来验证 字符串的比较大小才发现 原来是直接比较就可以不用纠结那么多
3上码
#includebits/stdc.h
using namespace std;int main(){int N,max 0,count 0;mapstring,intm;mapstring,int::iterator t;cin N;string maxid;for( int i 0; i N; i ){string str1,str2;cin str1 str2;m[str1]; //也就是m[str]代表的就是 键值 m[str2]; //如果遇到 相同的关键字 则 键值加一 if( m[str1] max){max m[str1];maxid str1;} if( m[str2] max ){max m[str2];maxid str2;}// cout m[str1] m[str2] endl; }for( t m.begin(); t ! m.end(); t ){if(t-second max){count; }}if(count 1){cout maxid max;}else{for( t m.begin(); t ! m.end(); t ){if(t-second max){cout t-first max count;break; }} }}//4
//13005711862 13588625832
//13505711862 13005711862
//13588625832 13005711862
//15005713862 135886258324:上超时码
这个码我也要上毕竟也是我努力的结果敲码当中 最难受的事情了莫过于 你写的代码超时了这就基本判定i你要重写了毕竟你再怎么该也是原来的那个思路 时间复杂度不会降低多少的。 这个码用的是vector存的数据只想说一句 我以前沉浸与vector的时代 宣告告一段落了 我要更加深入到map当中
//string 存的字符串
#includebits/stdc.h
using namespace std;int cnt;int repeat(vectorstringv1,string a)
{for( int i 0; i v1.size(); i){if( v1[i] a)//判断两个字符串是否相等{cnt;}}return cnt;
}int main()
{vectorstringv,v1;int N,max 0,count 0; string min 9999999999;string str1,str2; cin N;for( int i 0; i 2 * N; i ){string str;cin str;v.push_back(str);}for( int i 0; i 2 * N; i ){cnt 0;int temp repeat(v,v[i]);if( temp max ) //求电话狂人 {max temp;str1 v[i];}} //求取有相同 通话次数的电话狂人 for( int j 0; j v.size(); j ){cnt 0;int temp repeat(v,v[j]);if( temp max ) //求电话狂人 {v1.push_back(v[j]); }} // for( int i 0; i v1.size(); i)
// cout v1[i] ;//去除 vector容器当中 重复的元素 sort(v1.begin(), v1.end());//unique(v1.begin(),v1.end()); //将重复的元素放到数组的最后面 v1.erase(unique(v1.begin(), v1.end()), v1.end());for( int j 0; j v1.size(); j ){if(v1[j] min){min v1[j];}} // cout v1.size();// cout count endl;if( v1.size() 1 )cout str1 max;elsecout min max v1.size();}最后还是希望陌生的你 加油