今日学习在线编程题:仙水购置

编程入门 行业动态 更新时间:2024-10-22 23:45:17

今日学习<a href=https://www.elefans.com/category/jswz/34/1770935.html style=在线编程题:仙水购置"/>

今日学习在线编程题:仙水购置

题目来源:码蹄集

时间限制:1000ms
内存限制:65535kb


题目描述:W有N个瓶子,都是由十分珍贵的材料制作的,所以他一直只有N个,以至于当她需要多于N种的仙水时,不得不把某一种仙水倒掉来盛放最新需要的仙水。
现在W需要完成一项工作,需要使用瓶子的仙水,如果瓶子里缺少当前需要的仙水,她就会去购买,初始她的瓶子里没有任何一种仙水
现在给定一个W需要的长度为p的仙水序列,问W至少需要购买多少次仙水,
如果瓶子里没有W需要的仙水,她不得不倒掉某一种,但不清楚应该倒哪一种,你可以帮W决定倒哪一种,来使她购买仙水的次数最少。


输入格式:若干组数据
请读取到文件末尾
对于每组数据,第一行三个数,N,m(W用到的仙水种类数,用1到m来表示),p(表示序列长度)
第二行p个数,仙水序列
输出格式:对于每一组数据输出一行,一个数字,表示最少的购买次数。


输入样例

2 3 5
3 1 2 1 2
3 4 5 
3 2 1 4 3
输出样例

3
4

备注

提示    
(0 < n,m,p <= 50000)
一种仙水可以反复使用的,只要在瓶子里,使用次数就无限

参考程序

#include<bits/stdc++.h>using namespace std;
const int N=1e5+10;
int a[N], vis[N], ne[N], last[N];
priority_queue<pair<int,int>>l;
void init(){while(!l.empty()) l.pop();memset(vis,0,sizeof(vis));memset(ne,0,sizeof(ne));memset(last,1000010,sizeof(last));
}
int main()
{   int n,m,q;while(cin >> n >> m >> q){init();for(int i=1;i<=q;i++)cin>>a[i];for(int i=q;i>=1;i--){ne[i]=last[a[i]];last[a[i]]=i;}int ans=0;for(int i=1;i<=q;i++){if(ans<n&&!vis[a[i]]){ans++;vis[a[i]]=1;}else if(ans>=n&&!vis[a[i]]){ans++;vis[l.top().second]=0;vis[a[i]]=1;l.pop();}l.push({ne[i],a[i]});}cout<<ans<<endl;}return 0;
}

更多推荐

今日学习在线编程题:仙水购置

本文发布于:2024-03-15 05:46:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1738226.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:在线   今日

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!