华为24秋招笔试1106:统计最少媒体包发送源个数 | dp 哈希表

【华为】20241106_1_统计最少媒体包发送源个数

Problem:

某媒体处理服务负责接收来自多个媒体发送源的媒体包,并根据收到的媒体包进行媒体渲染处理。当前有这样一个需求:给定收到的媒体包序列号列表,计算发送该媒体包的最少发送源个数。
约束:网络上没有重传媒体包,即:同一个发送源发送的媒体包序列号不会重复,且序列号每次加1(不考虑回绕问题,65535是发送源发送的最后一个媒体包序列号):如果收到的媒体包序列号不满足该规则,说明这些媒体包必然来自于多个发送源。
第一行:seqs列表长度n,1<=n<=10^5
第二行:seqs列表元素,元素之间通过空格隔开,任意媒体包序列号seqs[i],满足:0<=seqs[i]<=65535

Solution:

Tag:dp 哈希表(没太有必要)
复杂度:时间 O(n) ,空间 O(n)
思路:这道题很容易理解错题意,题目中隐含的意思是数据包发送的相对顺序是不可以变的,所以如果是3 4 1 2,那么输出的是2,而不是1,我一开始是直接用map记录次数,然后从最小的数开始递加算,但实际上应该从接收顺序从前往后算。
    给定一个长度为n的序列,问如何将序列归类为最少的连续递增的序列,连续递增序列应该满足,对于序列中任意i,满足a[i]=a[i-1]+1.
    用一个数组cnt,cnt[i]记录以i为结尾的发送源数量。
    对于每个i,如果i-1存在并且cnt[i-1]>0,就可以将i并入到以i-1为结尾的一个发送源中,否则i就自己开辟一个新的发送源,最后结果是cnt数组中所有数值总和。
#include<iostream>
#include<vector>
using namespace std;
#define MAXN 65537
int main() {
    vector<int> cnt(MAXN, 0); // 以i为结尾的发送源数量
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int t;
        cin >> t;

        if (t > 0 && cnt[t - 1]) { // 检查是否可以转移
            cnt[t - 1]--;
        }
        cnt[t]++; // 无论是否转移,都要加上以本次结尾的发送源
    }
    int res = 0;
    for (int i = 0; i < MAXN; i++) {
        res += cnt[i];
    }
    cout << res;
    return 0;
}

posted @ 2025-04-17 20:18  Sylvia_lee  阅读(27)  评论(0)    收藏  举报