Operating System

OperatingSystem

https://ac.nowcoder.com/acm/problem/15688

堆/优先队列

这个题目写起来不难,题目读起来是真的困难,出题人根本没把题目意思交代清楚……
观摩大佬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;
}
牛客算法竞赛入门课 文章被收录于专栏

给雨巨打call

全部评论
哥代码wa了啊
1 回复 分享
发布于 2022-07-29 11:32
是不是加强数据了,大佬你的代码wa了
点赞 回复 分享
发布于 2023-02-25 16:37 湖北
应该是if里判断ans是否小于n,else if里判断ans是否大于等于n才对。 不过学到了用memset初始化无穷大的用法,感谢!
点赞 回复 分享
发布于 2021-08-04 12:09
请问大佬这里为什么是判断ans是否大于n而不是堆的大小是否大于n呢?堆是内存的话应该看堆是否满啊
点赞 回复 分享
发布于 2021-04-26 17:14
优先队列默认大根堆,应该是按照下一次出现的位置降序排序吧
点赞 回复 分享
发布于 2020-07-10 10:27

相关推荐

柱柱想躺平:这是好事啊
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务