优质的随从慕名而来

题目

Description

YH 学长想在酒馆战旗中赢得第一名,因此他要找 Bob 用漏斗蛋糕招揽一些优质的随从!

有 n 个随从慕名而来,第 i 个随从的种类是 a_i。YH 学长十分贪心,他每个随从都想要,因此他准备了充足的黄金铸币并依次买下每一个随从。但即使如此,他也只能携带 m 个随从,当新买的随从无法加入队伍时,YH 学长只好卖掉队伍里之前最早买下的随从。

“啊哈,三连!”,机智的 YH 学长发现利用酒馆中的三连机制能够让随从们变得更加强大。当 YH 学长买下一个种类为 x 的随从时,若队伍里有另外两个随从种类也为 x ,他就凑成了一个“三连”。此时“三连”会将队伍中两个种类为x的随从移除,然后使买下的那个随从变为“金色”并加入队伍。

但为了防止 YH 学长的队伍变得太强,每当 YH 学长获得“金色”随从时,JC 学长就会偷偷卖掉这个”金色“随从。JC 学长想知道最后他需要卖掉多少 YH 学长的”金色“随从。

Input
第一行包含两个正整数 n,m(1<=m<=n<=1e6),表示随从的个数和队伍的容量。

第二行包含n个整数 ai(1<=ai<=1e6),表示第i次买下的随从的种类。

Output
输出一个整数,表示JC学长卖出的“金色”随从的个数

样例
input

10 3
2 1 1 1 2 3 3 1 3 1

output

2

分析:

通过分析本题可知,对于本题若采用满足题意(三连)直接删除的方式很难实现,所以可以采用构造一个队列的方式,当有满足题意(三连)的时候,将队列中的要删除的元素先标记,当队列已满要移动队列的时候,对于打上标记的元素在来考虑其直接出队的问题,这样就避免了有三连情况时,要直接删除元素的烦恼。
TLE code:
利用tt,hh,q[N] 模拟队列

#include<iostream>
using namespace std;
const int N = 1000100;
int tt,hh,q[N],num[N],ans,sign;
int main(){int n,m;cin >> n >> m;for(int i=0;i<n;i++){int x;cin >> x;num[x]++;q[tt++]=x;if(num[x]==3){ans++;num[x]-=3;for(int j=hh;j<tt;j++)       //打上标记的步骤if(q[j]==x) q[j]=-1;sign+=3;}if(hh-tt-sign > m){while(q[hh]==-1){hh++;sign--;}num[q[hh]]--;hh++;}}cout << ans;
}

但是我们可以发现打上标记的步骤是一个循环操作,当m很大的时候,这样的算法时间复杂度接近O(n^2),对于题目所给数据会超时
SO 我们要考虑进一步优化
其实我们可以用采用一个数组来记录要删除的元素,例如要删的元素x,我们让 数组[x]+=3,当队列已满要移动队列的时候,考虑数组是否为零,就相当于之前的标记操作,且这种标记方法的复杂度为O(1);
AC code:
1.模拟队列

#include<iostream>
using namespace std;
const int N = 1000010;
int tt,hh,q[N],num[N],ans,lop[N],sign;
int main(){int n,m;scanf("%d %d",&n,&m);for(int i=0;i<n;i++){int x;scanf("%d",&x);num[x]++;q[tt++]=x;        if(num[x]==3){ans++;num[x]-=3;lop[x]+=3;sign+=3;}      if(tt-hh-NUM > m){while(lop[q[hh]]>0){lop[q[hh]]--;hh++;sign--;}num[q[hh]]--;hh++;    }       }printf("%d",ans);
}

2.STL:

#include<iostream>
#include<queue>
using namespace std;
const int N = 10001000;
int num[N],ans,lop[N],sign;
queue<int> q;
int main(){int n,m;cin >> n >> m;for(int i=0;i<n;i++){int x;cin >> x;num[x]++;q.push(x);if(num[x]==3){ans++;num[x]-=3;lop[x]+=3;sign+=3;}if(q.size()-sign > m){while(lop[q.front()]>0){lop[q.front()]--;q.pop();sign--;}num[q.front()]--;q.pop();}}cout << ans;
}

扩展

将本题的 ai(1<=ai<=1e6)改成 ai (1<=ai<=1e9
由于数组的大小开不到 1e9,所以采用以上方法不能解决
思路:可以先采用 map 或 离散化 预处理:
code:

#include<iostream>
#include<queue>
#include<map>
using namespace std;
const int N = 10001000;
int ans,sign;
map<int,int> num,lop;
queue<int> q;
int main(){int n,m;cin >> n >> m;for(int i=0;i<n;i++){int x;cin >> x;num[x]++;q.push(x);if(num[x]==3){ans++;num[x]-=3;lop[x]+=3;sign+=3;}if(q.size()-sign > m){while(lop[q.front()]>0){lop[q.front()]--;q.pop();sign--;}num[q.front()]--;q.pop();}}cout << ans;
}

ps. m和n也要改小一点 eg. 3*1e5 应该就ok

DS homework-队列相关推荐

  1. DS栈+队列—排队游戏

    目录 题目描述 思路分析 AC代码 题目描述 在幼儿园中,老师安排小朋友做一个排队的游戏.首先老师精心的把数目相同的小男孩和小女孩编排在一个队列中,每个小孩按其在队列中的位置发给一个编号(编号从0开始 ...

  2. 深圳大学OJ——数据结构专项——实验03 队列及综合应用

    文章目录 A. DS队列+堆栈--数制转换 题目描述 输入 输出 输入样例1 输出样例1 代码 B. DS队列之银行排队 题目描述 输入 输出 输入样例1 输出样例1 代码 C. DS队列--组队列 ...

  3. dhu 4.1 队列模板简单应用算法设计:士兵队列训练

    队列模板简单应用算法设计:士兵队列训练 时间限制: 1S类别: DS:队列->队列定义及应用 晚于: 2022-05-04 23:55:00后提交分数乘系数50% 截止日期: 2022-05-0 ...

  4. DS博客作业03--栈和队列

    DS博客作业03--栈和队列 1.本周学习总结(0--1分) 谈谈你对栈和队列结构的认识及学习体会. 这章有认真预习,但做题还要依靠书,记不住,可能还需要多加练习,在PTA上的题只做了栈的,队列的做得 ...

  5. OSTEP-MLFQ(多级反馈队列)-HOMEWORK(simulation)

    1. Run a few randomly-generated problems with just two jobs and two queues; compute the MLFQ executi ...

  6. 06-B. DS队列之银行排队

    06-队列及综合应用- 题目描述 在银行营业大厅共服务3种客户,类型为A\B\C,大厅分别设置了3个窗口分别服务三种客户,即每个窗口只服务一种客户.现有一批客户来银行办理业务,每个客户都有类型和办理业 ...

  7. Re:从零开始的DS生活 轻松从0基础实现多种队列

    前言

  8. C. DS队列_动物收容所

    题目描述 有一家动物收容所只收容猫与狗,且严格遵守先进先出原则.在收养该收容所的动物时,收养人只能收养猫或狗,且收养的那一只动物必须是那种动物中剩下未被收养的最先进入收养所的那一只动物.换而言之,收养 ...

  9. c++数据结构中 顺序队列的队首队尾_数据结构 3.3 顺序队

    一些废话 光有理论是远远不够的,只有自己亲自敲过代码,做过编程题才能说自己学过数据结构.但被PTA的ds习题折磨了几天之后,我领悟到一个道理: 学习理论时可以用C语言造轮子深入理解. 上机做题时使用C ...

  10. Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

    基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat 1.3.使用虚拟地址访问 ...

最新文章

  1. .Net中简单实现发送邮件
  2. 一款免费好用的代码在线比较工具
  3. 数据库分片教程mysql_简述MySQL分片中快速数据迁移
  4. 转:Flash与.NET的通信(一):XMLConnector的应用
  5. CSS仿艺龙首页鼠标移入图片放大
  6. 漫步数理统计十五——两个随机变量的分布
  7. 三种常见的图像处理双三次插值算法
  8. 2-2 内建变量类型
  9. 激光雷达的KPI与技术方案
  10. android listView与adapter
  11. webstorm js没有代码提示
  12. 自动执行bash被拒绝 提示/bin/sh: /test.sh: Permission denied
  13. 数据库中如何求候选码
  14. 危化品厂区监控人脸识别/危化品识别EasyGBS+智能分析网关设备助力化工厂区安全生产
  15. Android 模拟屏幕点击和物理按键方式
  16. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)
  17. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day16】—— Spring框架2
  18. 求近似数最值_求近似数的方法
  19. Vue来回切换几次页面后,echart/页面越来越卡
  20. 智能小区java_java毕业设计_springboot框架的模式下的智能小区规划系统

热门文章

  1. Semantic-UI 的词语
  2. WIN7 安装使用远程服务器管理工具-如DHCP、AD域、HyperV、远程桌面
  3. 【其他】bilibili下载的m4s格式视频如何还原为mp4
  4. python爬虫自动更换ip_python爬虫:自动投票代码(自动爬取代理IP)
  5. 终端溯源图构建工具SPADE专题-1 SPADE工具安装
  6. UT2015学习笔记
  7. python爬虫+数据分析完整流程--豆瓣电影分类排行榜
  8. sklearn机器学习笔记:数据预处理与特征工程
  9. 第二届中国移动“梧桐杯”大数据应用创新大赛总决赛12强名单发布
  10. pe版linux操作系统制作,制作Linux版PE系统