博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[noip模拟]画展<队列的基础知识>
阅读量:6819 次
发布时间:2019-06-26

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

Description

博览馆正在展出由世上最佳的M位画家所画的图画。人们想到博览馆去看这几位大师的作品
。可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,
代表要看展览中的第a幅至第b幅画(包含a和b)之间的所有图画,而门票的价钱就是一张图画
一元。人们希望入场后可以看到所有名师的图画(至少各一张)。可是又想节省金钱……请你
写一个程序决定购买门票时的a值和b值。

Input

第一行是N和M,分别代表博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。
其后的一行包含N个数字,它们都介于1和M之间,代表该位名师的编号。
N<=1000000,M<=2000

Output

a和b(a<=b)由一个空格符所隔开。
保证有解,如果多解,输出a最小的。

Sample Input

12 52 5 3 1 3 2 4 1 1 5 4 3

Sample Output

2 7 这道题可能是我博客里最简单的一道题,但是可怕的是,我还是错了几次,这确实有点绝望。我的错误原因就是我自己认为一旦收集齐m个数字就跳出,但其实没有考虑到有可能在后面会有更小的值 当然这种错误真的是脑子抽了,这题的思路超级简单,就是一个O(n)复杂度的队列模拟,如果队首可以收缩,那就收缩; 好吧这就是全部思路,好吧题如此简单,我也就提供一个精简过后的代码吧
1 #include
2 #include
3 using namespace std; 4 int vis[2005],n,m,a,l=1,r,tot,ans=1000005,al,ar; queue
q; 5 int main(){cin>>n>>m; 6 for(int i=1;i<=n;i++){ 7 cin>>a; q.push(a); r++; 8 if(vis[a] == 0){tot++;} vis[a]++; 9 while(vis[q.front()] > 1 && l < r){l++; vis[q.front()]--; q.pop();}10 if(tot==m){
if(r-l+1
View Code

 

 

转载于:https://www.cnblogs.com/Danzel-Aria233/p/7517773.html

你可能感兴趣的文章
codeforces730I Olympiad in Programming and Sports(姿势题 优先队列?dp?)
查看>>
POJ 3260 The Fewest Coin
查看>>
201421410018 于佳裔 实验四
查看>>
【VUE】@click加上v-bind绑定切换类名及动画事件
查看>>
Microsoft发布新一代主机:Xbox One
查看>>
运维经验分享:关于系统运维监控的几点建议
查看>>
jQuery渐隐渐现字体发虚的问题
查看>>
[SDOI2008]烧水问题
查看>>
杂项之rabbitmq
查看>>
【转】关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)...
查看>>
jQuery练习题HTML文件
查看>>
SQL注入原理
查看>>
MySQL 锁(lock与latch)
查看>>
python
查看>>
DataTable数据存入指定路径的Excel文件
查看>>
Linq-C#左连接
查看>>
c和指针读书笔记
查看>>
常用正则表达式集锦
查看>>
JS 验证
查看>>
【Lua】特性和一些基础语法
查看>>