C++编程-牛客网-特征提取

题目:

小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的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
输出
3
说明
特征<1,1>在连续的帧中连续出现3次,相比其他特征连续出现的次数大,所以输出3

备注:
如没有长度大于2的特征运动,返回1

思路:
在一次测试中,共有M个帧,一个特征在一个帧里最多出现一次,在程序中,我们需要注意几个方面:
1.在检测第n个帧时,要判定第n-1个帧中出现的特征,即判定截至n-1个帧连续的特征有哪些,故而每个特征都需要一个bool 变量表明其是否连续。
2.在检测第n个帧时,已经出现过的特征但是没有出现在该帧时,要修改其记录为不连续。
3.对已经不连续,但出现过的特征要记录下该特征的最高值,故而每个特征需要一个整型变量Max_num记录下最高值

故而解题流程如下:
1.构建结构变量feature,用一个vector数组存储
2.构建一个has函数判定某个特征是否出现过
3.构建一个location函数用于定位一个已经出现的特征在vector数组中的位置
4.在遍历每一个帧内的特征时,
1)需要判定是否出现过:
若判定已出现,则判别该特征是否连续出现,若连续出现,则直接在该特征的连续出现次数+1,若不连续出现,则直接把该特征的连续出现次数修改为1。修改后,需判定是否超过历史最高值,若超过则需要修改历史最高值。
2)若判定未出现,则在vector数组中增加一个特征。
在当前帧出现过的特征需要记录下来,表示这些特征连续。而在当前帧未出现过的特征需要修改为不连续。
5.在遍历下一个帧之前,需要修改特征的连续符号。
在当前帧出现过的特征需要记录下来,表示这些特征连续。而在当前帧未出现过的特征需要修改为不连续。

代码:

#include<iostream>
#include<vector>
using namespace std;
struct feature
{
    int x;
    int y;
    int num;
    int Max_num;
    bool continue_flag;
    bool new_has;
};
bool has(vector<feature> all_feature,int x,int y)
{
    int length=all_feature.size();
    for(int i=0;i<length;i++)
    {
        if(all_feature[i].x==x&&all_feature[i].y==y)
        {
            return true;
        }
    }
    return false;
}
int location(vector<feature> all_feature,int x,int y)
{
    int length=all_feature.size();
    for(int i=0;i<length;i++)
    {
        if(all_feature[i].x==x&&all_feature[i].y==y)
        {
            return i;
        }
    }
    return -1;
}
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int M;
        cin>>M;
        vector<feature> all_feature;
        int M_th=M;
        while(M--)
        {
            int num;
            cin>>num;
            while(num--)
            {
                int x,y;
                cin>>x>>y;

                if(has(all_feature,x,y))
                {
                    int loc=location(all_feature,x,y);
                    all_feature[loc].new_has=true;
                    if(all_feature[loc].continue_flag==true)
                    {
                        all_feature[loc].num++;
                        if(all_feature[loc].num>all_feature[loc].Max_num)
                        {
                            all_feature[loc].Max_num=all_feature[loc].num;
                        }
                    }
                    else
                    {
                        all_feature[loc].num=1;
                        all_feature[loc].continue_flag=true;
                    }
                }
                else
                {
                    feature t;
                    t.x=x;
                    t.y=y;
                    t.num=1;
                    t.Max_num=1;
                    t.continue_flag=true;
                    if(M_th==M)
                    {
                        t.new_has=false;
                    }
                    else
                    {
                        t.new_has=true;
                    }
                    all_feature.push_back(t);
                }
            }
            int len=all_feature.size();
            for(int i=0;i<len;i++)
            {
                if(M=M_th)
                {
                    break;
                }
                if(all_feature[i].new_has==false)
                {
                    all_feature[i].continue_flag=false;
                }
            }
            
        }
        int all_feature_len=all_feature.size();
        int Max=all_feature[0].Max_num;
        for(int i=1;i<all_feature_len;i++)
        {
            if(Max<all_feature[i].Max_num)
            {
                Max=all_feature[i].Max_num;
            }
        }
        cout<<Max<<endl;
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android C 高级编程是指在Android开发中使用C语言进行高级编程的技术。而使用NDK(Native Development Kit)可以使开发者在Android应用中使用C/C++等本地语言进行编程。 NDK是一个工具集,它允许开发者在Android应用中嵌入本地代码,并且提供了一系列的开发工具和库,以便开发者能够在Android应用中使用C/C++进行高级编程。使用NDK可以提供更高的性能和更低的内存占用,适用于需要处理大量数据和高性能计算的应用场景。 在使用NDK进行Android C高级编程时,可以使用PDF(Portable Document Format)作为文档格式,以便对代码和项目进行更好的管理和文档化。在NDK的开发过程中,可以使用PDF文档记录关键的设计思路、代码逻辑、接口定义等信息,以方便团队协作和后续的维护。 使用NDK进行Android C高级编程的步骤大致如下: 1. 准备开发环境:安装NDK并配置好开发环境,包括设置NDK的路径和编译器等。 2. 创建新项目:使用Android Studio创建一个新的Android项目,并在项目中引入NDK的支持。 3. 编写C代码:使用C/C++语言编写需要调用的函数、算法或者数据结构等代码,并将其保存在适当的目录下。 4. 编写JNI接口:在生成的Java代码中,使用JNI(Java Native Interface)定义对应C代码的接口,以便在Java层调用C代码。 5. 编译和构建:使用NDK的工具集进行编译和构建,将C代码编译成适合Android平台使用的库文件(.so文件)。 6. 在Java代码中调用C代码:在需要调用C代码的地方,使用JNI接口调用对应的C函数,以实现和C代码的交互和调用。 使用PDF文档进行文档化可以帮助开发者更好地组织和管理代码、接口和设计文档等,方便后续的代码维护和项目协作。同时,也可以作为项目的参考文档,方便其他开发人员了解和使用项目。 ### 回答2: Android C 高级编程是针对使用NDK(Native Development Kit)的一种高级编程技术。NDK是Android开发工具包中的一个工具,允许开发者使用C、C++或其他本地编程语言编写Android应用程序的部分或全部代码。 使用NDK进行Android C高级编程有许多优点。首先,NDK提供了更高的性能和更好的控制权,特别是在处理图形、音频和计算密集型任务时。通过使用本地编程语言,开发者能够更好地利用底层系统资源,提高应用程序的执行效率和速度。 其次,NDK还提供了对现有C和C++库的支持。这意味着开发者可以使用许多已经存在的库和功能来加快开发进程。无需重新编写现有的代码,直接使用NDK与这些库进行集成即可。 在使用NDK进行Android C高级编程时,一种常见的用途是开发游戏。使用C或C++编写游戏代码可以获得更好的性能和更低的延迟,这对于游戏的流畅运行至关重要。 此外,开发者还可以使用NDK为现有的Java应用程序添加本地本地扩展。这样可以通过使用C或C++编写某些关键组件,以改进应用程序的性能或添加新的功能。 总的来说,通过使用NDK进行Android C高级编程,开发者可以获得更高的性能、更好的控制权和更好的资源利用。无论是开发游戏还是优化应用程序,使用NDK都是提高性能和扩展功能的好方法。通过阅读相关的PDF文档,开发者可以更深入地了解如何使用NDK进行Android C高级编程。 ### 回答3: Android NDK (Native Development Kit) 是一个用于开发 Android 应用程序的工具集,它使开发者能够使用 C 或 C++ 编写原生代码,并将其与 Java 编写的 Android 应用程序一起使用。使用 NDK 可以达到增加性能、复用现有的 C/C++ 代码以及访问底层硬件等目的。 在 Android C 高级编程中,使用 NDK 商用 PDF 库可以实现在 Android 应用程序中处理 PDF 文件的功能。PDF 文件是一种常见的电子文档格式,使用 PDF 库可以读取、编辑和生成 PDF 文件。 使用 NDK 进行 PDF 处理的一般步骤如下: 1. 集成 PDF 库:首先,需要将商用的 PDF 库 (.so 文件) 集成到 Android 项目中。可以通过在 Android.mk 文件中添加相关配置,确保 .so 文件正确地被编译和链接到应用程序中。 2. 创建 JNI 接口:为了在 Java 层与 C/C++ 层之间进行通信,需要创建 JNI (Java Native Interface) 接口。可以在创建 JNI 方法时使用 JNAerator 或者手动编写 JNI 代码,以便在 Java 层调用 C/C++ 的功能。 3. 对 PDF 文件进行处理:在 C/C++ 层,可以使用 PDF 库提供的功能来处理 PDF 文件。例如,可以使用库提供的函数来解析、渲染、添加标注、提取内容等。 4. 将数据返回给 Java 层:在 C/C++ 层处理完之后,可以通过 JNI 接口将处理后的数据返回给 Java 层。这样就可以在 Android 应用程序中显示或者存储处理后的 PDF 文件。 需要注意的是,在使用商用 PDF 库时,需要遵循相关的许可协议,并确保在开发和分发过程中合法使用该库。 总之,通过使用 NDK 和商用 PDF 库,可以使 Android 应用程序具有处理 PDF 文件的高级编程能力。同时,开发者需要具备 C/C++ 编程和 JNI 接口的使用经验,以便顺利地进行开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值