题意

小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的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,代表测试用例的个数。

每个测试用例的第一行包含一个正整数M,代表视频的帧数。

接下来的M行,每行代表一帧。其中,第一个数字是该帧的特征个数,接下来的数字是在特征的取值;比如样例输入第三行里,2代表该帧有两个猫咪特征,<1,1>和<2,2>
所有用例的输入特征总数和<100000

N满足1≤N≤100000,M满足1≤M≤10000,一帧的特征个数满足 ≤ 10000。
特征取值均为非负整数。

输出描述:

对每一个测试用例,输出特征运动的长度作为一行
输入例子1:

1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1

输出例子1:

3
例子说明1:

特征<1,1>在连续的帧中连续出现3次,相比其他特征连续出现的次数大,所以输出3

题解

题目的题意还是比较清楚的,即找出最长连续出现的特征数量。

首先,对于题目当中的特征是用两个int的pair对代表的,相同的pair被视为是同样的特征。特征必须要连续出现才算,中间中断则重新计算。

比较容易想到,我们可以使用map来存储所有的特征以及它当前出现的最多次数。这样我们虽然搞定了存储问题,但还需要解决另外两个问题。第一个问题是两个int构成的特征如何作为map的key,第二个问题是,有一些pair在之前的帧中出现过,但是中途中断了,我们如何快速清除?

使用pair

这两个问题我们一个一个来看,先看第一个问题。这个问题很好解决,在C++当中有一个数据结构叫做Pair,它是两个不同类型变量打包成的简单结构体,它可以作为map的key。

具体的用法非常简单,我们用pair<int, int>来声明两个int组成的特征,这里的类型可以根据自己的需要进行修改。当我们需要在map当中使用的时候, 我们采用同样的方式来声明map即可。比如可以写成这样:map<pair<int, int>, int>,由于这样书写比较麻烦,一般acmer会使用define宏定义将它进行简化。比如pair<int, int>通常会简化成pii,表示两个int的pair。

这样的话,我们声明和使用pair就会简单得多。

#define pii pair<int, int>

map<pii, int> mp;
pii p = pii(x, y);
临时map

第二个问题稍稍麻烦一些, 对于一些之前出现的pair,我们需要实时清除。但是我们的map当中只会存储特征连续出现的次数,并没有办法判断每一个特征有没有中断过。

对于这个问题,我们有一个很好的办法,就是使用两个map。第一个map存储的是历史上一直连续出现至今的特征,我们叫它老map。第二个map是临时map,用来储存当前帧加入之后依然持续出现的特征。这样我们只需要在当前帧处理结束之后,用临时的map去更新老map,这样就完成了map中内容的更新。

我这么说可能有一点抽象,大家可以参考一下代码以及注释,会好理解一些。这个技巧也是比赛当中非常常用的技巧,这样通过两个map的来回迭代,就省去了对key的清理工作,这样节省了大量时间。

源码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include "time.h"
#include <functional>
#define rep(i,a,b) for (int i=a;i<b;i++)
#define Rep(i,a,b) for (int i=a;i>=b;i--)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++)
#define mid ((l+r)>>1)
#define lson (k<<1)
#define rson (k<<1|1)
#define MEM(a,x) memset(a,x,sizeof a)
#define L ch[r][0]
#define R ch[r][1]
#define pii pair<int, int>
using namespace std;
const int N=1000050;
const long long Mod=1000000007;
int x, y;int main() {int t;scanf("%d", &t);rep(z, 0, t) {int m;scanf("%d", &m);map<pii, int> mp, cur;int ret = 1;int k;// 读入m帧rep(i, 0, m) {// 临时map记得清空cur.clear();scanf("%d", &k);// 读入k个特征rep(j, 0, k) {scanf("%d %d", &x, &y);pii p = pii(x, y);// 如果在老map中出现过,则更新临时mapif (mp.count(p)) {cur[p] = mp[p] + 1;ret = max(ret, cur[p]);}else {cur[p] = 1;}}// 临时map代替老mapmp = cur;}printf("%d\n", ret);}return 0;
}

从代码来看,这道题其实是不难的,也没用到什么高深的算法和数据结构。但是对于新手来说还是很有挑战的,主要是pair的应用很多人不熟悉,然后对于临时map这样的技巧可能也不一定能想得到。更何况这个还是笔试题,真正能在笔试的时候能写上来的就更加困难了,很需要代码能力。

建议大家最好能自己亲手写一下遇到问题之后再看标程,这样的提升最明显。

牛客网-数据结构笔试题目(一)-猫咪特征提取思路解析(附源码)相关推荐

  1. 牛客网-数据结构笔试题目(七)-k-amazing数字求解

    题意 给定n个数构成的数字,我们定义一个k-amazing数的概念.如果数a同时出现在数组中所有k个连续元素构成的序列当中,并且a是其中最小的那个,那么就称为a是一个k-amazing数字. 我们抽象 ...

  2. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解

    题意 有一个人在玩一个离子激活的游戏,题目的背景是模拟的化学当中的离子能量跃迁.在化学当中,离子吸收能量可以从低能态跃迁到高能态,并且放出一定的能量. 现在有N粒离子排成一排(下标1-N),每一个离子 ...

  3. 牛客网-数据结构笔试题目(五)-动态规划问题求解

    题意 给定n个整数,对于这n个整数我们可以采取两种操作.第一种操作是在数组左侧选择连续的k个整数减1,第二种操作是选择右侧的连续k个整数减1. 比如假设数组是[3, 2, 2, 1, 4],比如我们选 ...

  4. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)

    题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...

  5. 牛客网-数据结构笔试题目(三)-博弈论圆圈游戏(Circle Game)(附源码)

    题意 从前有两个人,一个叫Utkarsh,另外一个叫Ashish. 这两个人在一个2D的棋盘上玩移动棋子的游戏,一开始从原点出发,Ashish先手.每次可以把棋子向上或者是向右移动k个单位的距离.两人 ...

  6. 牛客网-数据结构笔试题目(二)-万万没想到之抓捕孔连顺思路解析(附源码)

    题意 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 我们在字节跳动大街的N个建筑中选定3个埋伏地点. 为了相互照应,我们决 ...

  7. 牛客网-数据结构笔试题目(六)-最近点对问题求解思路

    题意 我们先来看下题意吧,题意很简单,在一个平面当中分布着n个点.现在我们知道这n个点的坐标,要求找出这n个点当中距离最近的两个点的间距. 分治法 如果我们仔细思考一下,会发现这个问题和排序其实非常类 ...

  8. 牛客网 精品课程 《直通BAT面试算法精讲课》 优惠码立减10元

    牛客网 精品课程 <直通BAT面试算法精讲课> 优惠码 专属优惠码为:AszaxMb 或者直接打开专属优惠购课链接: http://www.nowcoder.com/courses/1?c ...

  9. 牛客网校招题题目收集----数据结构与算法篇

    选择题 a,b,c,d,e 对应出现的频率为4,6,11,13,15:以下符合哈夫曼编码的选项是?() A. a=000.b=01.c=001.d=10.e=11 B. a=000.b=001.c=0 ...

最新文章

  1. java取list中最大数值_Java后台通过Collections获取list集合中最大数,最小数代码
  2. 软件工程概论 课堂练习 第3次作业1【结构化系统分析——交通违章处理】
  3. protel PCB布线精华文章
  4. 解决ArcGIS 9.3卸载时出现invalid install.log file的方法
  5. app推送以及提示音java,springboot 整合 Jpush 极光推送
  6. 排队五小时才能吃上一口的Popeyes,要借阿里云数据中台10年内开足1500家门店
  7. JavaScript 中的异步:Event Loop 及其他
  8. 上传文件应注意的异常:FileUpLoad控件.
  9. 手记-数学分析(高等数学)中有关算法效率的公式列举(O,Θ,Ω)
  10. 博客搬家工具(服务)详解
  11. 用sokit发送http请求和响应
  12. 楪祈机器人_饥荒 Inori楪祈人物MOD
  13. android mvp知乎,安卓日记——MVP重构知乎日报
  14. 微信小程序调用域名服务器的服务
  15. Python爬取豆瓣top250书籍(beautifulsoup法)
  16. [ZZ]Sign Up for the First-Ever Appium Roadshow on August 20th in New York City
  17. UI设计课程教程分享:Banner的设计和技巧
  18. 什么是python 包_什么是python包
  19. C语言编程四平方和定理,第四平方和定理,用c语言实现
  20. 最常用的 Linux 命令都不会,你怎么敢去面试?

热门文章

  1. 视频光端机选型及常见品牌
  2. 光端机和收发器的区别有哪些?
  3. 【渝粤教育】 国家开放大学2020年春季 2136管理会计 参考试题
  4. android 检测过程,Android 系统对permision的检测过程
  5. ajax提交file空指针,excel导入上传文件报空指针错误
  6. mysql 去掉默认约束_06. 默认约束-创建、添加和删除
  7. 数字电路知识点杂谈(自用,其他人看不懂)
  8. python自动化工具哪个好用_10款好用的自动化测试工具推荐
  9. python自带的idle输入python_打开python自带IDLE出的问题
  10. python math.asin