机试题——统计最少媒体包发送源个数

题目描述

给定一个媒体包序列号列表,计算发送该媒体包的最少发送源个数。每个发送源发送的媒体包序列号不会重复,且每次加1(不考虑回绕问题,65535是发送源发送的最后一个媒体包序列号)。如果收到的媒体包序列号不满足该规则,则这些媒体包必然来自多个发送源。

输入描述

第一行:seqs列表长度 ( n )。

第二行:seqs列表元素,元素之间通过空格隔开。

输出描述

输出最少媒体包发送源个数。

用例输入

输入:

复制代码
11
1 2 3 4 5 6 7 8 9 10 10

输出:

复制代码
2

说明:

媒体包发送源 1:1 2 3 4 5 6 7 8 9 10

媒体包发送源 2:10

媒体发送源个数为 2,因此输出 2。

解题思路

问题分析

  1. 序列号规则:每个发送源发送的媒体包序列号是连续的,且不会重复。
  2. 目标:计算最少的发送源个数。
  3. 关键点:如果某个序列号 ( num ) 的前一个序列号 ( num - 1 ) 存在,则它们可以属于同一个发送源;否则,它们属于不同的发送源。

算法设计

  1. 使用动态规划数组

    • 创建一个大小为 65536 的数组 dp,用于记录以当前值为结束点的连接数量。
    • 初始化所有值为 0。
  2. 遍历输入序列号

    • 对于每个序列号 ( num ):
      • 如果 ( num - 1 ) 存在(即 dp[num - 1] > 0),则将 ( num - 1 ) 的计数减 1,表示num可以被连接到num - 1。
      • 同时,将 ( num ) 的计数加 1,表示当前序列号是一个新的结束点。
  3. 计算结果

    • 遍历 dp 数组,统计所有非零值的个数,即为最少发送源个数。

代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, num;
    cin >> n; // 输入序列号列表长度
    vector<int> dp(65536, 0); // 动态规划数组

    for (int i = 0; i < n; i++) {
        cin >> num; // 输入序列号
        if (num > 0 && dp[num - 1] > 0) {
            // 如果前一个序列号存在,则它们可以连接
            dp[num - 1]--;
        }
        dp[num]++; // 当前序列号计数加1
    }

    int res = 0;
    for (int i = 0; i < 65536; i++) {
        res += dp[i]; // 统计所有非零值的个数
    }

    cout << res << endl; // 输出结果
    return 0;
}
相关推荐
2501_924890522 分钟前
商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化
java·大数据·人工智能·深度学习·算法·目标检测·计算机视觉
艾醒10 分钟前
大模型面试题剖析:模型微调和蒸馏核心技术拆解与考点梳理
算法
艾醒1 小时前
大模型面试题剖析:微调与 RAG 技术的选用逻辑
算法
NAGNIP2 小时前
一文弄懂MOE
算法
重启的码农2 小时前
llama.cpp 分布式推理介绍(7) 远程后端缓冲区 (RPC Buffer)
c++·人工智能·神经网络
NAGNIP2 小时前
一文搞懂微调技术的发展与演进
算法
Vect__2 小时前
链表漫游指南:C++ 指针操作的艺术与实践
数据结构·c++·链表
古译汉书2 小时前
蓝桥杯算法之基础知识(2)——Python赛道
数据结构·python·算法·蓝桥杯
地平线开发者2 小时前
LLM 中增量解码与模型推理解读
算法·自动驾驶
.Vcoistnt2 小时前
Codeforces Round 1043 (Div. 3)(A-E)
数据结构·算法