博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Helvetic Coding Contest 2017 online mirror B. Heidi and Library (medium)(贪心)
阅读量:5240 次
发布时间:2019-06-14

本文共 1404 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

已知每天的借书序列,你最多能同时保存k种书,现在问你最多要买多少次书,一开始有0种书,超过k种就要扔掉。

题解:

考虑贪心。

首先,显然连续的多天同一种书可以看成存在一天。所以就先将连续重复去掉。

先预处理出每种书所在的位置,当当前的书的种类数大于k时,就扔掉那本下一次出现最晚的书。

然后这个可以用set搞一搞。

1 #include
2 #define F(i,a,b) for(int i=(a);i<=(b);++i) 3 using namespace std; 4 5 const int N=4e5+7; 6 struct node{ 7 int x,dis; 8 bool operator <(const node &b)const{
return dis==b.dis?x
b.dis;} 9 };10 11 int n,k,a[N],ed,now[N],sz;12 multiset
st;13 vector
nxt[N];14 int cnt[N];15 16 int main(){17 int ans=0;18 scanf("%d%d",&n,&k);19 F(i,1,n)scanf("%d",a+i);20 ed=1;21 F(i,2,n)if(a[i]!=a[ed])a[++ed]=a[i];22 F(i,1,n)nxt[a[i]].push_back(i);23 F(i,1,n)nxt[i].push_back(N);24 F(i,1,ed)25 {26 if(now[a[i]]==0)27 {28 now[a[i]]=1;sz++;29 ans++;30 if(sz>k)31 {32 now[(*st.begin()).x]=0;33 st.erase(st.begin());34 sz--;35 } 36 }else37 {38 multiset
::iterator it;39 it=st.lower_bound({a[i],i});40 st.erase(it);41 }42 st.insert({a[i],nxt[a[i]][++cnt[a[i]]]});43 }44 printf("%d\n",ans);45 return 0;46 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/7151060.html

你可能感兴趣的文章
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>
snmpwalk命令常用方法总结
查看>>
网站产品设计
查看>>
代理ARP
查看>>
go 学习笔记(4) ---项目结构
查看>>
java中静态代码块的用法 static用法详解
查看>>
Java线程面试题
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
Java IO流学习总结
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>