bzoj 1826 缓存交换
题目大意:
一些数,需要将他们依次取入一个集合中
集合的容量有限
若该数已经在集合中则不用再取
每次取的时候可以将集合中与元素替换为另一个,也可以不换,直接加入前提是不超过集合容量
求最后最小的取数次数
思路:
可以想到一个贪心算法
就是下一次将要被取位置越远的书应该先被从集合中删除
因此我们可以使用优先队列这一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 缓存交换的更多相关文章
- 1826: [JSOI2010]缓存交换
1826: [JSOI2010]缓存交换 https://www.lydsy.com/JudgeOnline/problem.php?id=1826 分析: 简单的贪心,然后调啊调...最近怎么了,码 ...
- 【BZOJ1826】[JSOI2010]缓存交换(贪心)
[BZOJ1826][JSOI2010]缓存交换(贪心) 题面 BZOJ 洛谷 题解 当缓存不满显然直接放进去,满了之后考虑拿走哪一个.不难发现拿走下一次出现时间最晚的那个一定不会更差. 那么用一个堆 ...
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...
- bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换
bzoj1528[POI2005]sam-Toy Cars bzoj1826[JSOI2010]缓存交换 题意: Jasio有n个不同的玩具,它们都被放在了很高的架子上,地板上不会有超过k个玩具.当J ...
- 无缓存交换 牛客网 程序员面试金典 C++ Python
无缓存交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值. 给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回 ...
- BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流
传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...
- BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)
题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...
- BZOJ 2668: [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1112 Solved: 409[Submit][Status ...
- Luogu P4404 [JSOI2010]缓存交换 优先队列
细节题?...调了半天.... 可以发现,每一次从缓存中删除的主存一定是下次访问最晚的,可以用优先队列来处理...还有要离散化...还有链表末尾要多建一些点...否则会死的很惨... #include ...
随机推荐
- MySQL-----操作练习
一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: select A.student_id from (select ...
- Python之数字
Python之数字 int(数字)===>在Python3中,int没有范围,在Python2中,int超出范围就叫长整型(Long). 浮点运算:单精度 float 双精度 double a: ...
- C++ 赋值运算符重载
类的定义 class Test{ int id; public: Test(int i): id(i){ cout << "obj_" << i <& ...
- Quartz --quartz.properties
quartz.properties 如果项目中没有该配置文件,则会去jar包中读取自带配置文件 默认的配置如下 # Default Properties file for use by StdSche ...
- Vue如何在data中正常引入图片路径
在Vue项目中通过data设置图片路径,然后在template中引入后页面无法显示图片,浏览器控制台报错: 刚开始以为是路径出问题了,于是绝对路径.相对路 ...
- Microsoft Azure 资料整理
鉴于Microsoft Azure的技术迭代更新相当快,所以推荐大家还是以官方文档为准. 以Global Azure 的为主,Mooncake版本自行删减 首先推荐Azure for MSDN htt ...
- xtu summer individual-4 A - Beautiful IP Addresses
Beautiful IP Addresses Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on Code ...
- golang函数指针的效果
package main import ( "fmt" ) func fun1(key string) { fmt.Printf("fun11 key=%s\n" ...
- Codeforces913E. Logical Expression
现有串x=11110000,y=11001100,z=10101010,通过这三个串只用与或非三种操作到达给定的串,优先级非>或>与,可以加括号,问表达式最短的里面字典序最小的是谁,有&l ...
- CF601D:Acyclic Organic Compounds
给n<=300000的树,每个点上有一个字母,一个点的权值为:从该点出发向下走到任意节点停下形成的不同字符串的数量,问最大权值. 题目本身还有一些奇怪要求在此忽略.. Trie合并的模板题. # ...