一道很妙的贪心题
我们考虑当我们插入时会面临的两种情况
当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了。
-
当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置。
这就需要我们替换一个,根据我们贪心的思想,当一种玩具出现的比较晚
的时候,那么我们就可以把它拿走,因为他后面用的次数比较少,这样妈妈
的移动次数就会少很多 。
那么,我们就有了处理这道题的思路,先求出每个点,他下一次要玩的时间
为 \(net_i\) 用堆来维护地板上玩具 \(net_i\) 的最大值,来维护上述过程。
坑点
多测数据一定要清空,最后不要忘记把堆清空
如果当前这个玩具后面都不会在玩它,我们应该把他的 \(net_i\)
数组设为一个极大值,而不是0如果当前这个点已经在地板上,我们依旧要把它入队,来代替之前的那个玩具。(我在这里卡了好长时间)
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的更多相关文章
-
洛谷 P3419 [POI2005]SAM-Toy Cars
P3419 [POI2005]SAM-Toy Cars 题目描述 Johnny is a little boy - he is only three years old and enjoys play ...
-
P3419 [POI2005]SAM-Toy Cars
Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上 ...
-
【sam复习】用sam实现后缀排序
没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...
-
[POI2005]SAM-Toy Cars 贪心+堆
[POI2005]SAM-Toy Cars 题目:Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们:为了让他的房间有足够的空 ...
-
[POI2005]SAM-Toy Cars
题目描述 Johnny is a little boy - he is only three years old and enjoys playing with toy cars very much. ...
-
SAM初探
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
-
hihocoder SAM基础概念
后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...
-
[LintCode] Toy Factory 玩具工厂
Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...
-
hdu 5343 MZL&#39;s Circle Zhou SAM
MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...
随机推荐
-
Javascript内存泄露
在过去一些的时候,Web开发人员并没有太多的去关注内存泄露问题.那时的页面间联系大都比较简单,并主要使用不同的连接地址在同一个站点中导航,这样的设计方式是非常有利于浏览器释放资源的.即使Web页面运行 ...
-
Java Thread.join()方法
一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...
-
Jenkins 2.7.3 LTS 发布
更新如下: Stop A/B testing of the remoting JNLP3 protocol due to the known issues. The protocol can be e ...
-
FFMPEG之TimeBase成员理解
http://blog.csdn.net/supermanwg/article/details/14521869
-
python模块与包加载机制
模块的搜索路径: When a module named spam is imported, the interpreter searches for a file named spam.py in ...
-
GCC依赖库顺序问题
今天在把linux下做的ipmsg移植到windows过程中,因为包含了一个开源库SimpleSocket,而这个库又引用了winsock2,没太注意就写下了下面的makefile: g++ -o t ...
-
Java知识点复习
总结下java的知识点 final 关键字-方法:不能被子类重写(override)-变量:不能被修改-类:不可以被继承,派生子类 finally 关键字与try/catch语句配合使用,即使有异常抛 ...
-
C#理解AutoResetEvent和ManualResetEvent
当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考 ...
-
Linux运维笔记-日常操作命令总结(1)
在linux日常运维中,我们平时会用到很多常规的操作命令. 查看服务器的外网ip [root@redis-new01 ~]# curl ifconfig.me [root@redis-new01 ~] ...
-
vo优化总结
问题1:位姿估计用的ransac,只用了几个点,如果3d_2d点存在噪声,不行.优化:把这值当做初值,用非线性优化问题2:深度图有误差,深度过近或过远不行,有误差.而特征点往往在物体边缘处,深度测量值 ...