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

题目描述

给定一个媒体包序列号列表,计算发送该媒体包的最少发送源个数。每个发送源发送的媒体包序列号不会重复,且每次加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;
}
相关推荐
Asize7 分钟前
数组数据结构底层:从灵活到陷阱
前端·javascript·算法
John_ToDebug14 分钟前
Chromium 132→148 升级实战:Legacy IPC 消息丢失问题深度解析
c++·chrome·ai·架构
wuminyu23 分钟前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
hairenwangmiao32 分钟前
B4041 [GESP202409 四级] 区间排序
算法·排序
人道领域42 分钟前
【LeetCode刷题日记】47.全排列Ⅱ
java·开发语言·算法·leetcode
漂流瓶jz44 分钟前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Navigator_Z1 小时前
LeetCode //C - 1095. Find in Mountain Array
c语言·算法·leetcode
不会就选b1 小时前
算法日常・每日刷题--<二分查找>1
算法
「維他檸檬茶」1 小时前
大模型算法学习2026.6.13
学习·算法
叫我:松哥1 小时前
基于Python的共享单车租赁数据分析与预测系统,技术栈flask+boostrap+随机森林+XGBoost
人工智能·python·深度学习·算法·随机森林·数据分析·flask