题目大意:

一些数,需要将他们依次取入一个集合中

集合的容量有限

若该数已经在集合中则不用再取

每次取的时候可以将集合中与元素替换为另一个,也可以不换,直接加入前提是不超过集合容量

求最后最小的取数次数

思路:

可以想到一个贪心算法

就是下一次将要被取位置越远的书应该先被从集合中删除

因此我们可以使用优先队列这一STL来表示当前集合

当集合未满的时候不停的推入直到集合满

集合满的时候若元素不在集合中,则删除下一个位置最远的队首,然后加入

但是当元素在集合时,我们不能不予处理,需要更新它的下一次位置

但是这样非常难做,就需要我们把容量++,把这个新的元素加入队列

还要离散化。。

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#define inf 2147483611
#define ll long long
#define MAXN 101010
using namespace std;
inline int read()
{
int x=,f=;
char ch;ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
struct pr
{
int next,val;
bool operator < (const pr &a) const
{
return next<a.next;
}
}a[MAXN];
struct data
{
int pos,val;
}g[MAXN];
bool cmp(data p,data q) {return p.val<q.val;}
int n,k,hash[MAXN],ans;
priority_queue <pr> q;
bool vis[MAXN];
int main()
{
n=read(),k=read();
for(int i=;i<=n;i++) g[i].val=read(),g[i].pos=i;
sort(g+,g+n+,cmp);
int cnt=;
for(int i=;i<=n;i++)
{
a[g[i].pos].val=cnt;if(g[i].val!=g[i+].val) cnt++;
}
for(int i=;i<=n;i++) hash[a[i].val]=i;
for(int i=n;i>=;i--)
{
if(hash[a[i].val]!=i) a[i].next=hash[a[i].val];
else a[i].next=inf;
hash[a[i].val]=i;
}
int i=;
while(ans<k&&i<=n)
{
if(!vis[a[i].val]) ans++;
q.push(a[i]);
vis[a[i].val]=;
i++;
}
for(i;i<=n;i++)
{
if(vis[a[i].val]) {q.push(a[i]);continue;}
vis[q.top().val]=;
vis[a[i].val]=;
q.pop();
q.push(a[i]);
ans++;
}
printf("%d",ans);
}

bzoj 1826 缓存交换的更多相关文章

  1. 1826: [JSOI2010]缓存交换

    1826: [JSOI2010]缓存交换 https://www.lydsy.com/JudgeOnline/problem.php?id=1826 分析: 简单的贪心,然后调啊调...最近怎么了,码 ...

  2. 【BZOJ1826】[JSOI2010]缓存交换(贪心)

    [BZOJ1826][JSOI2010]缓存交换(贪心) 题面 BZOJ 洛谷 题解 当缓存不满显然直接放进去,满了之后考虑拿走哪一个.不难发现拿走下一次出现时间最晚的那个一定不会更差. 那么用一个堆 ...

  3. BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心

    BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...

  4. bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换

    bzoj1528[POI2005]sam-Toy Cars bzoj1826[JSOI2010]缓存交换 题意: Jasio有n个不同的玩具,它们都被放在了很高的架子上,地板上不会有超过k个玩具.当J ...

  5. 无缓存交换 牛客网 程序员面试金典 C++ Python

    无缓存交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值. 给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回 ...

  6. BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流

    传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...

  7. BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)

    题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...

  8. BZOJ 2668: [cqoi2012]交换棋子

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1112  Solved: 409[Submit][Status ...

  9. Luogu P4404 [JSOI2010]缓存交换 优先队列

    细节题?...调了半天.... 可以发现,每一次从缓存中删除的主存一定是下次访问最晚的,可以用优先队列来处理...还有要离散化...还有链表末尾要多建一些点...否则会死的很惨... #include ...

随机推荐

  1. 五段实用的js高级技巧

    技巧一之setTimeout. 应用案例:比如你想一个函数循环执行10次,怎么办?以前通常是先setInterval,然后clearInterval,技巧一就是克服这个问题 复制代码 代码如下: (f ...

  2. HDU 1525 Euclid Game

    题目大意: 给定2个数a , b,假定b>=a总是从b中取走一个a的整数倍,也就是让 b-k*a(k*a<=b) 每人执行一步这个操作,最后得到0的人胜利结束游戏 (0,a)是一个终止态P ...

  3. [luoguP1097] 统计数字(水)

    传送门 这么水的题,也只有提高组第一题了吧 代码 #include <cstdio> #include <iostream> #include <algorithm> ...

  4. EditText隐藏和显示

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  5. ci框架(codeigniter)Email发送邮件、收件人、附件、Email调试工具

        ci框架(codeigniter)Email发送邮件.收件人.附件.Email调试工具 Email 类         CodeIgniter 拥有强大的 Email 类来提供如下的功能: 多 ...

  6. 基于端口的信息探测-portscan-1.0

    http://www.tiaozhanziwo.com/archives/174.html

  7. hiho一下 第五十周 (求欧拉路径)

    http://hihocoder.com/contest/hiho50/problem/1 这题有重边,所以邻接矩阵用来统计节点u,v之间有多少条边相连,并且用另外一个数组统计每个节点的入度. 然后查 ...

  8. 【进击后端】Ubuntu 命令行 安装nginx

    一.安装nginx apt-get install nginx 安装路径为:/etc/nginx/conf.d 二.配置nginx,在conf.d目录下新建test.conf 新建文件的命令是vi t ...

  9. mysql 安装与卸载

    mysql用了也好几年了,但每次安装完或者卸载完就忘记了安装步骤以及卸载步骤,因此将关键的步骤记录下来,供以后参考. 1.mysql安装 ①安装类型有typical,complete,custom,一 ...

  10. 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

    题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...