P1638 逛画展——尺取法的妙用
题目描述
博览馆正在展出由世上最佳的 mm 位画家所画的图画。
游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而门票的价钱就是一张图画一元。
Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。
请求出他购买门票时应选择的 a,ba,b,数据保证一定有解。
若存在多组解,输出 aa 最小的那组。
输入格式
第一行两个整数 n,mn,m,分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。
第二行包含 nn 个整数 a_iai,代表画第 ii 幅画的名师的编号。
输出格式
一行两个整数 a,ba,b。
输入输出样例
输入 #1复制
12 5 2 5 3 1 3 2 4 1 1 5 4 3
输出 #1复制
2 7
说明/提示
数据规模与约定
- 对于 30\%30% 的数据,有 n\le200n≤200,m\le20m≤20。
- 对于 60\%60% 的数据,有 n\le10^5n≤105,m\le10^3m≤103。
- 对于 100\%100% 的数据,有 1\leq n\le10^61≤n≤106,1 \leq a_i \leq m\le2\times10^31≤ai≤m≤2×103。
一切尽在代码中:
//尺取法
/*
主要思想,双指针
right用于揽收,直至left到right之间序列包含所有画家的画
left用于释放,直至left到right之间序列缺失某个画家的画
这样历遍循环;直至right>order.length
(注意,这里当right=order.length时要做特殊处理,即right指针到终点时,在满足left释放的条件时,依然要进行left的释放)
occur_count[]用于记录不同画家的画出现的次数;用于left和right指针状态切换时的判断条件
*/
package 算法;import java.io.*;public class 逛画展 {//psvm:自动补mainpublic static void main(String[] args) throws IOException {StreamTokenizer r = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));r.nextToken();//缓冲,识别回车int print_Count = (int) r.nval;//画的数量r.nextToken();int printer_Count = (int) r.nval;//画家的数量int order[] = new int[print_Count];//画的序号for (int i = 0; i < order.length; i++) {r.nextToken();order[i] = (int) r.nval;}int occur_count[] = new int[printer_Count + 1];//记录不同画家的画出现的次数int begin = 0;int end = order.length - 1;int left_cursor = 0;int right_cursor = 0;while ((right_cursor <order.length && left_cursor <= order.length - printer_Count)||(right_cursor==order.length&&is_All_exist(occur_count))) {if (is_All_exist(occur_count)) {if ((right_cursor - 1 - left_cursor) < (end - begin)) {begin = left_cursor;end = right_cursor - 1;}occur_count[order[left_cursor]]--;left_cursor++;} else {occur_count[order[right_cursor]]++;right_cursor++;}}pr.println((begin + 1) + " " + (end + 1));pr.flush();}public static boolean is_All_exist(int a[]) {boolean flag = true;int count = 0;for (int i = 0; i < a.length; i++) {if (a[i] == 0) {count++;if (count == 2) {flag = false;break;}}}return flag;}
}
P1638 逛画展——尺取法的妙用相关推荐
- 洛谷 [P1638 逛画展] (尺取法)
Link https://www.luogu.org/problemnew/show/P1638 Description 博览馆正在展出由世上最佳的 M 位画家所画的图画.wangjy想到博览馆去看 ...
- P1638 逛画展(尺取)
逛画展 - 洛谷https://www.luogu.com.cn/problem/P1638 #include <iostream> #include <cstdio> #in ...
- 尺取法 P1638 逛画展
P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...
- 洛谷 P1638 逛画展
洛谷 P1638 逛画展 题目链接 题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必 ...
- 洛谷P1638 逛画展
题目描述 博览馆正在展出由世上最佳的 m 位画家所画的图画. 游客在购买门票时必须说明两个数字,a 和 b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a,b)之间的所有图画,而门票的价钱就是一 ...
- P1638 逛画展(直尺法)
这道题是直尺法的模板题: #include<iostream> using namespace std; const int maxn = 1e6 + 5; const int M = 2 ...
- P1638 逛画展(C语言)
题目描述 博览馆正在展出由世上最佳的 m 位画家所画的图画. 游客在购买门票时必须说明两个数字,a 和 b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a,b)之间的所有图画,而门票的价钱就是一 ...
- 洛谷P1638 逛画展-最简单的双指针做法
思路:定义双指针x和y代表[x,y]区间,初始化x=y=0开始遍历,刚开始时一直增加y直到包含了所有作家的画,然后就从左边x开始删区间有重复作家的画就行.注意不要把任何一个作家的画删到0!! 代码如下 ...
- [Luogu]P1638逛画展
注意到满足要求的区间具有单调性,于是想到用滑动窗口. 区间具有单调性,即若[L,R]满足条件, [L,R+1]必满足条件,并且[R+1,L]有可能满足条件.如此一来不用O(n^2)枚举左右端点,这样去 ...
最新文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】...
- 走进武汉,探索多媒体开发最佳实践
- Jni Helloworld
- SQLServer数据库收缩相关知识笔记
- IE Firefox通用DOM
- 前端学习(2275)初始化react
- Jaxb annotation使用
- 下载丨7月数据库技术通讯:LINUX OS配置问题导致数据库重启
- python新手入门代码-[代码全屏查看]-新手初学Python实现某论坛自动签到功能
- 赫兹的单位换算_hz单位换算
- C# 扫描识别图片中的文字(.NET Framework)
- originPro2021(7)导出图表不清晰
- 用c语言屏蔽鼠标键盘,用VBS屏蔽键盘和鼠标
- 《指导生活的算法》读后感
- Python编程之读取Excel csv格式文件内容
- 蜜蜂在挡板外和框梁顶造赘脾的几个要素及处理方法
- B. Sereja and Mirroring
- javascript TSP
- 工业物联网与物联网区别_企业可以从物联网中受益的7种方法
- Java使用AES/EBC/PKCS5Padding加密,CryptoJS解密错误