P3419 [POI2005]SAM-Toy Cars / SP688 SAM - Toy Cars
一道很妙的贪心题
我们考虑当我们插入时会面临的两种情况
当地上的玩具,不满 \(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's Circle Zhou SAM
MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...
随机推荐
- UI 科学
以简书为案例讲述「尼尔森十大可用性原则」 http://www.jianshu.com/p/a45e4ad68e20 你真的懂得尼尔森的十大可用性原则么? http://jy.sccnn.com/po ...
- 【经验分享】用adb揪出安卓APP弹窗广告的原形
背景 相信不少安卓用户中过影子弹窗广告的困扰,这种推广APP本体在后台运行,而且可以在其他APP上弹出覆盖广告,一不小心就会误操作,点击广告或者下载APP,着实令人恶心. 以前的广告软件只在通知栏会推 ...
- Mono嵌入C++
http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-embedding.html https://www.mono-pr ...
- 【python开发】迈出第一步,这可能是我唯一一次的Python开发了
好久没写博了,今天就瞎唠唠吧 背景: 组内有个测试平台,是基于Python2+tornado 框架写的,之前自己维护了一套系统的UIweb自动化代码,现在需要集成进去.这很可能是自己唯一一次基于pyt ...
- Java是否还能再辉煌十年?
目录 Java是否还能再辉煌十年? 一.前言 二.如今的Java语言 2.1 位居TIOBE榜首 2.2 革命性的语言 三.Java受到的挑战 3.1 后台服务器软件的语言竞争 3.1.1 Pytho ...
- 简单介绍HTML5 Landmark
最近在进行无障碍相关文档翻译的时候遇到了 landmark 的概念,在网上搜了下发现没有相关的中文资料,因此写一篇博客简单介绍一下. 什么是 Landmark Landmark 是一种用来表示网页组织 ...
- 2申请高德地图key 初始化地图
https://console.amap.com/dev/key/app vue-amap-基于-vue-2x-与高德的地图组件 https://elemefe.github.io/vue-amap/ ...
- oracle之二物化视图
物化视图 18.1.物化视图作用 1) 物化视图起源于数据仓库,早期的考虑是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免在基表上进行这些耗时的操作,从而快速的得 ...
- UI自动化页面需要选择上传文件
UI自动化页面上传文件,百度查的时候说有4中方法,简便的方法是安装SendKeys,但是百度说这个只支持python2.7的 我的python版本是3.7的,目前还只碰到了非<input typ ...
- element ui 分页记忆checked
<el-table :data="tableData" border ref="multipleTableChannel" @selection-chan ...