原题:
博览馆正在展出由世上最佳的 M 位画家所画的图画。wangjy想到博览馆去看这几位大师的作品。
可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票的价钱就是一张图画一元。为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张)。可是他又想节省金钱。。。作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值。
输入输出格式
输入格式:
第一行是 N 和 M,分别代表博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。其后的一行包含 N 个数字,它们都介于 1 和 M 之间,代表该位名师的编号。
输出格式:
a和 b(a<=b) 由一个空格符所隔开。保证有解,如果多解,输出a最小的。
输入输出样例
输入样例#1:
12 5
2 5 3 1 3 2 4 1 1 5 4 3
输出样例#1:
2 7
数据说明;
N<=1000000 , M<=2000
题意:
有n个数字,每一个数字都在1-m内,寻找其中包含1-m所有数字的最短区间。
题解:
这道问题一开始想着就是暴力求解,先得到每一个数字出现的次数,遍历每一个左端点,对于每一个左端点寻找包含所有数字的右端点。这样对付一些数据是可行的,但是对于更极限的数据就会TLE。
这也是这道题的考点吧,我们可以通过类似于移动窗口来优化。
先找到,满足条件的最小的左右端点l,r,ansl=l,ansr=r,之后向后移动左右端点,如果满足条件则与先前的l,r比较,若之间的距离小于先前的ansl,ansr之间的距离则更新ansl,ansr。
附上AC代码:

#include <iostream>
#include <cstring>
using namespace std;
int n,m,a[1000005];
int vis[2005];//定义一个数组来储存每一个数字在当前区间内出现的次数
int main()
{cin>>n>>m;memset(vis,0,sizeof(vis));//初始化为0for(int i=1;i<=n;++i){cin>>a[i];}int l=1,r=0,num=0,ansr,ansl;//l,r作为循环中的左端点和右端点,ansl,ansr作为最终结果for(int i=1;i<=n;++i)//循环找到左端点为1的包含所有数字的最小右端点r{if(vis[a[i]]==0)num++;vis[a[i]]++;r++;if(num==m)break;}while(vis[a[l]]>1)//找到以r为右端点的包含所有数字的左端点lvis[a[l++]]--;ansl=l,ansr=r;//初始化最终结果,作为后面判断的依据for(int i=r+1;i<=n;i++)//从右端点开始移动寻找符合条件的左右端点{vis[a[i]]++;//再读入r后的元素,右移rr++;while(vis[a[l]]>1)vis[a[l++]]--;//满足条件的情况下左移lif(ansr-ansl>r-l)//判断是否比之前的小,若小则更新ansl和ansr。判断符号是小于可以保证在长度相同时输出的ansl最小{ansr=r;ansl=l;}}cout<<ansl<<" "<<ansr<<endl;return 0;
}

洛谷-P1638-逛画展相关推荐

  1. 洛谷 P1638 逛画展

    洛谷 P1638 逛画展 题目链接 题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必 ...

  2. 洛谷 [P1638 逛画展] (尺取法)

    Link https://www.luogu.org/problemnew/show/P1638 Description  博览馆正在展出由世上最佳的 M 位画家所画的图画.wangjy想到博览馆去看 ...

  3. 洛谷P1638 逛画展

    题目描述 博览馆正在展出由世上最佳的 m 位画家所画的图画. 游客在购买门票时必须说明两个数字,a 和 b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a,b)之间的所有图画,而门票的价钱就是一 ...

  4. 洛谷P1638 逛画展-最简单的双指针做法

    思路:定义双指针x和y代表[x,y]区间,初始化x=y=0开始遍历,刚开始时一直增加y直到包含了所有作家的画,然后就从左边x开始删区间有重复作家的画就行.注意不要把任何一个作家的画删到0!! 代码如下 ...

  5. 【洛谷 P1638】 【单调队列】 逛画展

    [洛谷 P1638] [单调队列] 逛画展 题目 解题思路 先求出最前面囊括所有画的位置 然后如果左边界的画不止存在一次,左边界右移 不断扩展右边界,求取答案 代码 #include<iostr ...

  6. 尺取法 P1638 逛画展

    P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...

  7. P1638 逛画展(尺取)

    逛画展 - 洛谷https://www.luogu.com.cn/problem/P1638 #include <iostream> #include <cstdio> #in ...

  8. P1638 逛画展——尺取法的妙用

    题目描述 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而 ...

  9. 洛谷 P3953 逛公园

    原题链接 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 NN 个点 MM 条边构成的有向图,且没有 自环和重边.其中 11 号点是公园的入口,NN 号点是公园的出口,每条边有一个非负权值, 代表 ...

  10. 洛谷P3953 逛公园(dp 拓扑排序)

    题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...

最新文章

  1. SLAM学习,小白入门到殿堂级大牛资料整理
  2. MySQL5.5编译安装
  3. 电脑勒索病毒之谜:用户如何能确保电脑安全
  4. 推荐一本基于ASP.NET Core 3.1的实战来了
  5. android变量要不要附空值,android-如何在使用Parcelable时序列化空值
  6. Java 并发编程之可重入锁 ReentrantLock
  7. Python实现一条基于POS算法的区块链
  8. 给创业前的你4点建议
  9. 电脑任务栏跑到右边去了_手把手教你用U盘安装Win10系统?学会了再也不用去跑电脑店了...
  10. android 面向对象,android 面向对象六大原则
  11. jquery升级到新版本报错[jQuery] Cannot read property ‘msie’ of undefined错误的解决方法...
  12. js字符串转日期类型
  13. python windows ui自动化_pywinauto处理UI自动化
  14. python写一个木马_Python编写简易木马程序 - 博客频道 - CSDN.NET
  15. idea 和tomcat 中文乱码问题
  16. win10底部任务栏无响应怎么修复
  17. OTA频发的“大数据杀熟”,想要治你不容易?
  18. 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
  19. PL-2303HX新版驱动
  20. 苹果蕉文案:水果店苹果蕉推广文案

热门文章

  1. 进阶篇:5.1)公差分析的总流程
  2. python中双等号与单等号的区别_双等号 == 与单等号 =
  3. 漫步华尔街——股市历久弥新的成功投资策略读书笔记
  4. Android studio Your SDK location contains non-ASCII characters解决方法
  5. 【STM32】在Keil5中创建一个工程模板-图文教程(超详细)
  6. char、nchar、varchar、nvarchar的区别和特点
  7. IDEA 2020版 创建第一个WEB网站——教程
  8. 轻松识别文字,这款Python OCR库支持超过80种语言
  9. 把16进制值转换成颜色颜色16进制值表
  10. Linux笔记之浅析Linux文件管理