标签:map 输出 int 代码 赛真题 second vector
L2-039 清点代码库 (25 分)
上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”
这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。
输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤10^4
)和 M(≤10^2),对应功能模块的个数和系列测试输入的个数。
随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。
输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。
输入样例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
输出样例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35
比赛的时候看到这个题,我的第一反应就是可以用string来存功能的输出,再用map来记录。可是map不能排序啊,所以我想了一会儿,想到个小技巧。用vector的构造函数来拷贝map来排序。见代码
#include "bits/stdc++.h"
using namespace std;
map<string ,int> m;
int n,m1,num[10010];
bool cmp(pair<string,int> a,pair<string,int> b)//定义排序规则
{
if(a.second!=b.second) return a.second>b.second;
else return a.first<b.first;
}
int main()
{
cin>>n>>m1;
getchar();
while(n--)
{
string a;//我直接用字符串来读入
getline(cin,a);
if(m.find(a)==m.end()) m[a]=1;//找不到就直接插入
else m[a]++;//否则++
}
cout<<m.size()<<endl;
vector<pair<string,int> > v(m.begin(),m.end());//使用vector来将map转化过来,既然map不能排序,我就换成vector呗!
sort(v.begin(),v.end(),cmp);
for(auto i:v) cout<<i.second<<' '<<i.first<<endl; //auto是C11引入的自动变量,自动识别参数类型
}
正当我性勃勃的想要拿满分的时候,运行结果出来了…
我人傻了,想不出它哪里还能卡我的点。最后,我还是决定不要偷懒,既然它给了我m,那我还是用它吧。
改动也很简单,把string改成vector就行了
见代码
#include "iostream"
#include "map"
#include "vector"
#include "algorithm"
using namespace std;
map<vector<int> ,int> m;//将string换成vector
int n,m1,num[10010];
bool cmp(pair<vector<int>,int> a,pair<vector<int>,int> b)
{
if(a.second!=b.second) return a.second>b.second;
else return a.first<b.first;
}
int main()
{
cin>>n>>m1;
getchar();
while(n--)
{
vector<int> a;
for(int i=0;i<m1;i++)
{
int b;
cin>>b;
a.push_back(b);
}
m[a]++;
}
cout<<m.size()<<endl;
vector<pair<vector<int>,int> > v(m.begin(),m.end());//都是一样的......
sort(v.begin(),v.end(),cmp);
for(auto i:v)
{
cout<<i.second;
for(int j=0;j<m1;j++)
cout<<' '<<i.first[j];
cout<<endl;
}
}
我忐忑的点了提交,结果
虽然我写出来了,但是我还是不明白它卡我卡在哪,难道string和vector有什么特别的地方让编译器能分辨出来吗?
如有大佬知道,可以在评论区指点一下小弟
总而言之,题目是解出来了,cherr!
我是阡陌,一个在打ACM的业余选手。如果你喜欢这篇博客,就点个赞再走吧!
标签:map,输出,int,代码,赛真题,second,vector
来源: https://blog.csdn.net/qq_52488169/article/details/116330474
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。