【华为】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;
}