堆/优先队列
这个题目写起来不难,题目读起来是真的困难,出题人根本没把题目意思交代清楚……
观摩大佬AC代码之后,看的有点懵,反正给出的数,需要求一下下一次出现的位置,可以用2个数组,也可以用umap去离散记录。我就不展开了。
其余的就是贪心的思路了,按下一次出现优先降序排序,最大的那个最先出队,如果出现时间相同,按照输入的数据升序排序,可看代码用了pair自带的二元组,第一元素先升序,第二元素再升序。关于最先出队C++的优先队列即可满足。
#include <bits/stdc++.h> using namespace std; #define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0) const int N = 1e5 + 7; int a[N], vis[N], ne[N], last[N]; priority_queue<pair<int, int>> pq; int main() { js; int n, m, q; while (cin >> n >> m >> q) { while (pq.size()) pq.pop(); memset(vis, 0, sizeof(vis)); memset(ne, 0, sizeof(ne)); memset(last, 0x3f, sizeof(last)); //无穷大 for (int i = 1; i <= q; ++i) cin >> a[i]; for (int i = q; i; --i) ne[i] = last[a[i]], last[a[i]] = i; int ans = 0; for (int i = 1; i <= q; ++i) { if (pq.size() < n and !vis[a[i]]) ++ans, vis[a[i]] = 1; else if (pq.size() == n and !vis[a[i]]) { ++ans; vis[pq.top().second] = 0; vis[a[i]] = 1; pq.pop(); } pq.push({ ne[i],a[i] }); } cout << ans << endl; } return 0; }