SAM-Toy Cars题解
题目描述
Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间. 他的妈妈很清楚自己的孩子所以他能够预料到Jasio 想玩些什么玩具. 所以她想尽量的使自己去架子上拿玩具的次数尽量的少,应该怎么安排放玩具的顺序呢?
输入输出格式
输入格式:
第一 行三 个整数:n,k,p(1≤k≤n≤100,000,1≤p≤500000), 分别表示玩具的总数,地板上玩具的最多个数以及 JasioJasio 他想玩玩具的序列的个数,接下来 pp 行每行描述一个玩具编号表示 Jasio 想玩的玩具。
输出格式:
一个数表示 JasioJasio 的妈妈最少要拿多少次玩具。
输入输出样例
输入样例#1:
3 2 7
1
2
3
1
3
1
2
输出样例#1:
4
思路
luogu一直AC不了的小朋友们看这里:
不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars
不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars
不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars
至于为什么,我也不知道。。。反正本人卡了3次提交在luogu上(手动滑稽)
这道题使用贪心+堆优化。
贪心为:
每一次输入一个数将弹出一个大小为k的集合中的一个数才能使该数加入。
当然,如果该数早就在集合当中就可以直接切换到下一个数。
前k个数也可以直接进入集合中。
问题来了?到底弹集合中的哪一个数才能最优呢?
当然是下一次出现的距离最远的那一个数了。
堆优化:
priority_queue<int> q;
就是一个大根堆。
那么这道题需要将堆里的类型修改一下。
priority_queue<pair<int,int> >q;
pair的前一个储存节点的下一次出现位置,第二个储存该节点的值。
这样就可以自动的排序出距离最远的那一个数了。
所以每次操作只需要将q.top()取出,然后将头元素删除——q.pop()。
最后,上代码:
#include<algorithm>
#include<bitset>
#include<complex>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<locale>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<typeinfo>
#include<utility>
#include<valarray>
#include<vector>
#include<cstring>
#include<cmath>
#define ll long long
#define FHAKIOI int
using namespace std;//头文件结束
inline ll read(){
ll ret=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-f;ch=getchar();}
while (ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return ret*f;
}//读优结束
inline void write(ll zx){
if(zx<){zx=-zx;putchar('-');}
if(zx<) putchar(zx+'');
else{
write(zx/);
putchar(zx%+'');
}
}//输优结束
ll n,k,p,a[];
ll use[];
ll f[];
ll las[],ans;
ll nxt[];
priority_queue<pair<int,int> > q;//堆
FHAKIOI main(){
n=read();k=read();p=read();
for(ll i=;i<=p;i++) a[i]=read(),las[a[i]]=p+;//读入
for(ll i=p;i>=;i--){
nxt[i]=las[a[i]];
las[a[i]]=i;
}//先预处理与下一次出现的位置的距离
for(int i=;i<=p;i++){
if(use[a[i]]!=){
q.push(make_pair(nxt[i],a[i]));//已经在集合里了
}else if(k!=){//前K个数
k--;
ans++;
use[a[i]]=;
q.push(make_pair(nxt[i],a[i]));
}else{//最后一种情况,需要弹出一个数
while(!use[q.top().second]) q.pop();//目前没有在集合中
int x=q.top().second;//取距离最远的
q.pop();
use[x]=;
ans++;//ans加一
use[a[i]]=;
q.push(make_pair(nxt[i],a[i]));
}
}
write(ans);putchar('\n');/输出
return ;
}
SAM-Toy Cars题解的更多相关文章
- P3419 [POI2005]SAM-Toy Cars / SP688 SAM - Toy Cars
一道很妙的贪心题 题面 我们考虑当我们插入时会面临的两种情况 当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了. 当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置. 这就 ...
- 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 ...
- 周赛-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 ...
- A - Toy Cars
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Little ...
- 水题 Codeforces Round #303 (Div. 2) A. Toy Cars
题目传送门 /* 题意:5种情况对应对应第i或j辆车翻了没 水题:其实就看对角线的上半边就可以了,vis判断,可惜WA了一次 3: if both cars turned over during th ...
- 题解 CF545A 【Toy Cars】
题目传送门 太弱了,只能写写A题的题解 题意 给你一个 $n·n$ 的矩阵,翻车分三种情况: 如果 $a_i,_j=1$ ,记录第 $i$ 辆车 如果 $a_i,_j=2$ ,记录第 $j$ 辆车 如 ...
- Bzoj 1229: [USACO2008 Nov]toy 玩具 题解 三分+贪心
1229: [USACO2008 Nov]toy 玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 338 Solved: 136[Submit] ...
- [POI2005]Toy Cars
题目大意: 有n种物品,地上有k个格子,p次操作. 每次操作要求将某一个指定的物品移动到任意一个格子中,同时你可以选择是否将格子中的某一个物品收起来,并消耗1的代价. 如果下达指令时,这个物品刚好在格 ...
- CF605A Sorting Railway Cars 题解
To CF 这道题依题意可得最终答案为序列长度-最长子序列长度. 数据范围至 \(100000\) 用 \(O(n^2)\) 的复杂度肯定会炸. 用 \(O(nlogn)\) 的复杂度却在第 \(21 ...
随机推荐
- bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)
这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...
- Yii2 控制器单独向view(layout)传值
Yii2,layout中使用Controller的值,Controller向layout传值的两种方式. yii2中在通过Controller向layout中传值,layout中访问Controlle ...
- PID控制算法的C语言实现七 梯形积分的PID控制算法C语言实现
在PID控制律中积分项的作用是消除余差,为了减小余差,应提高积分项的运算精度,为此,可将矩形积分改为梯形积分. 梯形积分的计算公式为: pid.voltage=pid.Kp*pid.err+index ...
- 安装黑苹果的config.plist
前提条件:有mac真机.目前在测试虚拟机可行性 第一步:制作U盘启动盘 1.在 app store 下载 mac OS sierra 镜像 2.格式化 U 盘,gpt 格式 3.执行以下命令(具体名称 ...
- 抓包 ------ Wireshark 的使用
Wireshark的数据包详情窗口,如果是用中括号[]括起来的,表示注释,在数据包中不占字节 发了一个包,很久没有收到应答后,会重发包,在Wireshark抓包工具提示“[TCP Retransmis ...
- Cochran’s Q Test
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- centos7 ffmpeg安装
#Nux Dextop库依赖于EPEL库,所有要先安装EPEL库yum -y install epel-release #安装Nux Dextop库rpm -Uvh http://li.nux.ro/ ...
- mysql数据库使用sql命令窗口查询的数据,改成sql语句导入到mysql数据库中
1.查询语句为select * from t_table;导出的数据格式如下: 2.将数据文本备份,然后使用NOTEPAD++打开,然后只拷贝数据到新建txt中,然后进行如下替换: 1)将“ | ”分 ...
- 使用 WebSockets 技术的 9 个应用场景
没有其他技术能够像WebSocket一样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现.对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的支持 ...
- 【CodeForces】913 C. Party Lemonade
[题目]C. Party Lemonade [题意]给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价.1<=30<=n,1< ...