Description

​ Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间. 他的妈妈很清楚自己的孩子所以他能够预料到Jasio 想玩些什么玩具. 所以她想尽量的使自己去架子上拿玩具的次数尽量的少,应该怎么安排放玩具的顺序呢?

Input

​ n,k,p(1≤k≤n≤100 000, 1≤p≤500 000), 之后p行表示想玩玩具的顺序。

Output

​ 最少的拿玩具的次数。

Sample Input

  1. 3 2 7
  2. 1
  3. 2
  4. 3
  5. 1
  6. 3
  7. 1
  8. 2

Sample Output

  1. 4

​ 一道挺好的贪心题。

​ 挺简单就过了,地上最多放\(k\)个玩具,如果要加入一个新的玩具,那就把下一次出现时间最晚的那个玩具拿走,用堆每次取一个最大出现时间就好了。还有一个注意的点就是:如果有两个相同的玩具,不用把先出现的那个弹走,如果把它弹走会\(Tle\),因为晚出现的那个玩具一定比早出现的那个更优,如果要取出只会取出晚出现的。

​ 还有一个点:一开始有相同的玩具,记得判断一下。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <queue>
  5. using namespace std;
  6. inline long long read() {
  7. long long s = 0, f = 1; char ch;
  8. while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
  9. for(s = ch ^ 48;isdigit(ch = getchar()); s = (s << 1) + (s << 3) + (ch ^ 48));
  10. return s * f;
  11. }
  12. const int N = 5e5 + 5;
  13. int n, k, p, ans;
  14. int a[N], vis[N], siz[N], last[N];
  15. struct toy {
  16. int id, siz;
  17. toy() {}
  18. toy(int x, int y) { id = x; siz = y; }
  19. friend bool operator < (const toy &a, const toy &b) {
  20. return a.siz < b.siz;
  21. }
  22. } ;
  23. priority_queue <toy> q;
  24. void init() {
  25. n = read(); k = read(); p = read();
  26. for(int i = 1;i <= p; i++) a[i] = read();
  27. for(int i = 1;i <= n; i++) last[i] = p + 1;
  28. for(int i = p;i >= 1; i--) {
  29. siz[i] = last[a[i]], last[a[i]] = i;
  30. }
  31. }
  32. void work() {
  33. int tmp;
  34. for(tmp = 1; ; tmp++) {
  35. if(vis[a[tmp]]) {
  36. q.push(toy(a[tmp], siz[tmp]));
  37. }
  38. else {
  39. ans++; q.push(toy(a[tmp], siz[tmp]));
  40. vis[a[tmp]] = 1;
  41. }
  42. if(ans == k) break;
  43. }
  44. for(int i = tmp + 1;i <= p; i++) {
  45. if(vis[a[i]]) {
  46. q.push(toy(a[i], siz[i]));
  47. continue;
  48. }
  49. int x = q.top().id;
  50. vis[x] = 0; q.pop();
  51. q.push(toy(a[i], siz[i]));
  52. vis[a[i]] = 1;
  53. ans++;
  54. }
  55. printf("%d", ans);
  56. }
  57. int main() {
  58. init();
  59. work();
  60. return 0;
  61. }

P3419 [POI2005]SAM-Toy Cars的更多相关文章

  1. P3419 [POI2005]SAM-Toy Cars / SP688 SAM - Toy Cars

    一道很妙的贪心题 题面 我们考虑当我们插入时会面临的两种情况 当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了. 当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置. 这就 ...

  2. 洛谷 P3419 [POI2005]SAM-Toy Cars

    P3419 [POI2005]SAM-Toy Cars 题目描述 Johnny is a little boy - he is only three years old and enjoys play ...

  3. 周赛-Toy Cars 分类: 比赛 2015-08-08 15:41 5人阅读 评论(0) 收藏

    Toy Cars time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  4. Codeforces Round #303 (Div. 2) A. Toy Cars 水题

     A. Toy Cars Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/problem ...

  5. A - Toy Cars

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Little ...

  6. 水题 Codeforces Round #303 (Div. 2) A. Toy Cars

    题目传送门 /* 题意:5种情况对应对应第i或j辆车翻了没 水题:其实就看对角线的上半边就可以了,vis判断,可惜WA了一次 3: if both cars turned over during th ...

  7. [POI2005]Toy Cars

    题目大意: 有n种物品,地上有k个格子,p次操作. 每次操作要求将某一个指定的物品移动到任意一个格子中,同时你可以选择是否将格子中的某一个物品收起来,并消耗1的代价. 如果下达指令时,这个物品刚好在格 ...

  8. 题解 CF545A 【Toy Cars】

    题目传送门 太弱了,只能写写A题的题解 题意 给你一个 $n·n$ 的矩阵,翻车分三种情况: 如果 $a_i,_j=1$ ,记录第 $i$ 辆车 如果 $a_i,_j=2$ ,记录第 $j$ 辆车 如 ...

  9. bzoj1528 sam-Toy Cars(贪心,优先队列)

    「BZOJ1528」[POI2005] sam – Toy Cars Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Ja ...

随机推荐

  1. 初识分布式:MIT 6.284系列(一)

    前言 本系列是源于「码农翻身」所属知识星球发起的读书活动,由大佬 @我的UDP不丢包 推荐而来,这次的读书活动有一些另类,我们抛弃了传统的书籍,开始攻略最高学府的研究生顶级课程 <6.824&g ...

  2. Ef Core增加Sql方法

    [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] public class DbFunAttribute : Attri ...

  3. 001_解析go语言中的闭包

    go语言中的闭包,是大家学习go语言的一个大难点,笔者在学习时候也是痛苦不堪,在来回对比了其它语言的用法,并且查阅了很多网上的文章,终于对闭包有了一个较为清晰的认识,以下就是关于闭包的解析 首先看一个 ...

  4. 001_go语言中的hello world

    代码演示: package main import "fmt" func main() { fmt.Println("hello world") } 代码解读: ...

  5. C++基础面试题及答案

    C++ C++ 和C的主要区别 C语言是面向过程编程,C++是面向对象编程,C++ 完全兼容C C++有哪些特性,简述对他们的理解 封装.继承.多态 封装 将的事物抽象成一个个集合(也就是所说的类), ...

  6. Vue3 为何使用 Proxy 实现数据监听

    博客地址:https://ainyi.com/93 vue3 响应式数据放弃了 Object.defineProperty,而使用Proxy来代替它 我们知道,在 vue2 中,实现数据监听是使用Ob ...

  7. 常见排序算法原理及JS代码实现

    目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...

  8. C#LeetCode刷题之#205-同构字符串(Isomorphic Strings)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3770 访问. 给定两个字符串 s 和 t,判断它们是否是同构的. ...

  9. go语言gRPC系列(三) - 使用grpc-gateway同时提供HTTP和gRPC服务

    1. gRPC提供HTTP服务 1.1 存在的意义 1.2 代码示例 1.3 使用postman尝试调用 1.4 gRPC客户端代码调用 2. 使用grpc-gateway同时提供HTTP和gRPC服 ...

  10. Mybatis 中判断参数长度

    <if test="params.length()!=2">