这题理解起来倒是挺容易,不过输入处理有点烦。
答题思路是先记录每个特征点所在的行编号,最好使用map进行记录,方便进行查询(使用数组的话后续的查询处理需要遍历,而且这儿我使用的是map而不是unordered_map,原因是我是用pair<int, int>存储点的,而unordered_map不支持以pair作为key)。然后判断每个点所在的行号是否存在连续的,取最大的就行了。
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int f(map<pair<int, int>, vector<int>> &mm){
int res = 0;
for(const auto & w : mm){
int val = 1;
for(int i = 1; i < w.second.size(); ++i){
if(w.second[i] == w.second[i-1] + 1) ++val;
else{//得到一段连续行号的长度
res = max(res, val);
val = 1;//重新置位,进入下一轮
}
}
res = max(res, val);//再去一次的原因是上面的最后一个可能会没有计算到(没有进入else)
}
return res;
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; ++i){
int m;
cin >> m;
map<pair<int, int>, vector<int>> mm;
for(int j = 0; j < m; ++j){
int cnt;
cin >> cnt;
for(int k = 0; k < cnt; ++k){
int a, b;
cin >> a >> b;
mm[{a, b}].push_back(j);
}
}
cout << f(mm) << endl;
}
return 0;
}
不过这儿数据结构的选择有很多,怎么方便查找怎么来就可以了。
另外还有个思路就是将特征(两个数)转化为字符串,就可以正常使用哈希了。