bzoj 1528: [POI2005]sam-Toy Cars
2014-11-30 21:11
141 查看
Description
Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间. 他的妈妈很清楚自己的孩子所以他能够预料到Jasio 想玩些什么玩具.所以她想尽量的使自己去架子上拿玩具的次数尽量的少,应该怎么安排放玩具的顺序呢?
Input
第一行三个整数: n, k, p (1 <= k <= n <= 100.000, 1 <= p <= 500.000), 分别表示玩具的总数,地板上玩具的最多个数以及Jasio 他想玩玩具的序列的个数,接下来p行每行描述一个玩具编号表示Jasio 想玩的玩具.Output
一个数表示Jasio 的妈妈最少要拿多少次玩具.Sample Input
3 2 71
2
3
1
3
1
2
Sample Output
4依旧是双倍经验系列【和1826】,不过我试着用优先队列写了一下
每次找最远的放回去就好。
因为优先队列不方便修改里面的值,所以我直接把新的值压入队列,弹出的时候再判断下是否存在。
速度还不错的样子..
【嗯,以后似乎不用写堆了】
#include<queue> #include<vector> #include<cstdio> using namespace std; int a[500001]; int next[500001]; int last[100001]; bool v[500001]; struct toy { int x,next; bool operator <(toy x) const { if(next<x.next) return true; return false; } }; priority_queue <toy>H; int main() { int n,k,p; scanf("%d%d%d",&n,&k,&p); int i; for(i=1;i<=p;i++) scanf("%d",&a[i]); for(i=1;i<=p;i++) { next[last[a[i]]]=i; last[a[i]]=i; } for(i=1;i<=p;i++) if(next[i]==0) next[i]=p+1; int s=0,ans=0; while(!H.empty()) H.pop(); for(i=1;i<=p;i++) { if(v[a[i]]) { toy t; t.x=a[i]; t.next=next[i]; H.push(t); } else if(s<k) { s++; toy t; t.x=a[i]; t.next=next[i]; H.push(t); v[a[i]]=true; ans++; } else { toy t=H.top(); while(!v[t.x]) t=H.top(); v[t.x]=false; H.pop(); t.x=a[i]; t.next=next[i]; H.push(t); v[a[i]]=true; ans++; } } printf("%d\n",ans); return 0; }
相关文章推荐
- 【BZOJ1528】[POI2005]sam-Toy Cars 贪心
- BZOJ1528: [POI2005]sam-Toy Cars
- 【bzoj1528】[POI2005]sam-Toy Cars
- bzoj1528 [POI2005]sam-Toy Cars
- BZOJ1528 [POI2005]sam-Toy Cars
- BZOJ 1528 POI2005 sam-Toy Cars 堆+贪心
- BZOJ 1528 [POI2005]sam-Toy Cars(优先队列)
- 【bzoj1528】 [POI2005]sam-Toy Cars
- 【BZOJ 1528】 1528: [POI2005]sam-Toy Cars (贪心+堆)
- [BZOJ1528][POI2005]sam-Toy Cars(贪心)
- 【BZOJ 1528】[POI2005]sam-Toy Cars 贪心+堆
- [POI2005]SAM-Toy Cars
- bzoj1526: [POI2005]ban- Bankomat
- 【bzoj1531】[POI2005]Bank notes 多重背包dp
- BZOJ 1531 POI2005 Bank notes 多重背包
- bzoj1529 [POI2005]ska Piggy banks(并查集)
- [bzoj1528/POI2005]sam-Toy Cars---贪心+堆
- 【bzoj 1826&1528】: [JSOI2010]缓存交换
- 【BZOJ1529】[POI2005]ska Piggy banks【并查集】
- 【BZOJ 3238】 3238: [Ahoi2013]差异(SAM)