#include #include #include <unordered_map>

using namespace std;

int main() { int p, k; cin >> p; vector a(p); for (int i = 0; i < p; i++) { cin >> a[i]; } cin >> k; unordered_map<int, int> mp; //记录每个知识点最后出现的页数 int left = 0, right = 0; //双指针 int count = 0; //已经看过的知识点数 int res = p; //最少连续页数,初始化为p while (right < p) { mp[a[right]]++; //将右指针所指的知识点加入哈希表 if (mp[a[right]] == 1) { //如果这个知识点是第一次出现 count++; //已经看过的知识点数加1 } while (count == k) { //当看完k个知识点时 res = min(res, right - left + 1); //更新最少连续页数 mp[a[left]]--; //将左指针所指的知识点从哈希表中移除 if (mp[a[left]] == 0) { //如果这个知识点没有出现过了 count--; //已经看过的知识点数减1 } left++; //左指针右移 } right++; //右指针右移 } cout << res << endl; return 0;

C++ 代码实现假设一本教材中有P页每页包含第ai个知识点知识点会有所重复现给出每页的知识点ai以及需要看的知识点数K请你求出能够看完全部1~K个知识点的最短连续页数是多少。注意本题必有解不存在不包含的知识点。输入描述3行第1行包含1个数字P代表页数的个数P。第2行包含P个数字代表教材每页中的知识点ai。第3行包含1个数字K代表需要看完的K个知识点。输出描述1行表示最少连续页数。

原文地址: https://www.cveoy.top/t/topic/fKTb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录