一道很妙的贪心题

题面

我们考虑当我们插入时会面临的两种情况

  1. 当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了。

  2. 当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置。

    这就需要我们替换一个,根据我们贪心的思想,当一种玩具出现的比较晚

    的时候,那么我们就可以把它拿走,因为他后面用的次数比较少,这样妈妈

    的移动次数就会少很多 。

那么,我们就有了处理这道题的思路,先求出每个点,他下一次要玩的时间

为 \(net_i\) 用堆来维护地板上玩具 \(net_i\) 的最大值,来维护上述过程。

坑点

  1. 多测数据一定要清空,最后不要忘记把堆清空

  2. 如果当前这个玩具后面都不会在玩它,我们应该把他的 \(net_i\)

    数组设为一个极大值,而不是0

  3. 如果当前这个点已经在地板上,我们依旧要把它入队,来代替之前的那个玩具。(我在这里卡了好长时间)

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int t,n,k,p,ans,a[500010],last[500010],net[500010];
bool used[100010];
inline int read()
{
int s = 0,w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s =s * 10+ch - '0'; ch = getchar();}
return s * w;
}
priority_queue<pair<int,int> >q;
int main()
{
t = read();
while(t--)
{
memset(last,0,sizeof(last)); memset(used,0,sizeof(used)); //多组数据一定要清空
n = read(); k = read(); p = read(); ans = 0;
for(int i = 1; i <= p; i++) a[i] = read();
for(int i = p; i >= 1; i--)
{
if(last[a[i]] == 0) net[i] = 2333333;//如果后面不会在玩这个玩具,我们要把他的 net[i] 数组设为极大值
else net[i] = last[a[i]];
last[a[i]] = i;
}
for(int i = 1; i <= p; i++)
{
if(used[a[i]])
{
k++;//如果这种玩具已经在地板上,我们要把他入队来替代之前不优的
q.push(make_pair(net[i],i));
}
else
{
if(q.size() < k)//Case1
{
q.push(make_pair(net[i],i));
used[a[i]] = 1; ans++;
}
else//Case2
{
int t = q.top().second; q.pop();
used[a[t]] = 0; used[a[i]] = 1; ans++;
q.push(make_pair(net[i],i));
}
}
}
printf("%d\n",ans);
while(!q.empty()) q.pop();//最后记得把堆清空
}
return 0;
}

另外,此题还有双倍经验 QAQ。

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

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

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

  2. P3419 [POI2005]SAM-Toy Cars

    Description ​ Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上 ...

  3. 【sam复习】用sam实现后缀排序

    没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...

  4. [POI2005]SAM-Toy Cars 贪心+堆

    [POI2005]SAM-Toy Cars 题目:Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们:为了让他的房间有足够的空 ...

  5. [POI2005]SAM-Toy Cars

    题目描述 Johnny is a little boy - he is only three years old and enjoys playing with toy cars very much. ...

  6. SAM初探

    SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...

  7. hihocoder SAM基础概念

    后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...

  8. [LintCode] Toy Factory 玩具工厂

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  9. hdu 5343 MZL's Circle Zhou SAM

    MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...

随机推荐

  1. 手写区分PC还是手机移动端

    区分首先要了解window.navigator 输出navigator appCodeName: "Mozilla" appName: "Netscape" a ...

  2. java安全编码指南之:Mutability可变性

    目录 简介 可变对象和不可变对象 创建mutable对象的拷贝 为mutable类创建copy方法 不要相信equals 不要直接暴露可修改的属性 public static fields应该被置位f ...

  3. WebStorm下ReactNative代码提示设置

    ReactNative 代码智能提醒  (Webstrom live template) https://github.com/virtoolswebplayer/ReactNative-LiveTe ...

  4. 【C#】静态构造方法与静态变量

    扯下闲篇先,本来今天预计整理下委托.事件.Lamada的笔记,然后再把单例模式的懒汉.饿汉模式看完. 在看到懒汉的双重加锁设计时,向同桌贩卖了下该设计的优点,结果反被同桌的一个问题难倒了~! 一. 有 ...

  5. java初探(1)之秒杀项目总结

    在开始总结之前,先记录一个刚看到的博客,编程规约.该博客记录了一些java开发上的规范,可以在编码的时候引入这些规范. 无论流行框架一直怎么改变,web开发中的三层架构一直属于理论的基础存在. 表现层 ...

  6. SICP 习题1.10

    题目要求 解题方法 递归计算 没什么好说的,单纯的套用数学公示 (define (f n) (if (< n 3) n (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 ...

  7. 简单介绍HTML5 Landmark

    最近在进行无障碍相关文档翻译的时候遇到了 landmark 的概念,在网上搜了下发现没有相关的中文资料,因此写一篇博客简单介绍一下. 什么是 Landmark Landmark 是一种用来表示网页组织 ...

  8. Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头

    一.HSSFWorkbook与SXSSFWorkbook的区别: HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls SXSSFWorkbook时对Excel200 ...

  9. oracle之二实例管理及数据库的启动/关闭

    实例管理及数据库的启动/关闭   2.1 实例和参数文件 1.instance 功能:用于管理和访问database.instance在启动阶段读取初始化参数文件(init parameter fil ...

  10. IDEA使用 live template添加groovy脚本给方法,类,js方法添加注释(转载)

    IDEA添加Live Template: File->Setting->Editor->Live Templates Abbreviation: * Template text: * ...