版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
(编程题) 小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么这俩是同一个特征。
因此,如果喵咪特征连续一致,可以认为喵咪在运动。也就是说,如果特征<a, b>在持续帧里出现,那么它将构成特征运动。比如,特征<a, b>在第2/3/4/7/8帧出现,那么该特征将形成两个特征运动2-3-4 和7-8。
现在,给定每一帧的特征,特征的数量可能不一样。小明期望能找到最长的特征运动。
参考代码
n = int(input())
while n > 0:
m = int(input())
res = 1
d = {}
for i in range(m):
l = list(map(int , input().split()))
k = l[0]
tmp_d = {}
for j in range(k):
index = l[2 * j + 1] * 1000000000 + l[2 * j + 2]
if index in d:
tmp_d[index] = d[index] + 1
res = max(res, tmp_d[index])
else:
tmp_d[index] = 1
d = tmp_d
print(res)
n -= 1
c++版
map套set 存进去之后找连续的
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<bits/stdc++.h>
using namespace std;
map< pair<int,int>, set<int> > m1;
int main()
{
// freopen("in","r",stdin);
int n,m;
cin>>n;
while(n--){
cin>>m;
int maxn=0,now=0;
int k;
int x,y;
for(int i=0;i<m;i++){
cin>>k;
for(int j=0;j<k;j++){
cin>>x>>y;
m1[make_pair(x,y)].insert(i);
}
}
for(map <pair<int,int>, set<int> >::iterator it=m1.begin();it!=m1.end();it++){
int num=0;
int sum=1;
set<int>::iterator itt=it->second.begin();
num=*itt;
itt++;
for(;itt!=it->second.end();itt++){
if(*itt==num+1){
sum++;
num=*itt;
}
else
{
num=*itt;
maxn=max(maxn,sum);
sum=1;
}
}
if(itt==it->second.end()) maxn=max(maxn,sum);
}
cout<<max(maxn,now)<<endl;
}
return 0;
}