acwing 651. 逛画展
地址 https://www.acwing.com/problem/content/653/
博览馆正在展出由世上最佳的 M 位画家所画的图画。
wangjy想到博览馆去看这几位大师的作品。
可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票的价钱就是一张图画一元。
为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张)。
可是他又想节省金钱。。。
作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值。
输入格式
第一行包含两个整数 N 和 M,表示图画总数和画家数量。
第二行包含 N 个整数,它们都介于 1 和 M 之间,代表画作作者的编号。
输出格式
输出两个整数 a 和 b。
数据保证有解,如果存在多个解,则输出 a 最小的那个解。
数据范围
1≤N≤1061≤N≤106,
1≤M≤20001≤M≤2000
输入样例:
12 5
2 5 3 1 3 2 4 1 1 5 4 3
输出样例:
2 7
主要是考虑使用滑动窗口 使用哈希记录其中各个画家出现的次数 但是tle
#include <iostream>
#include <map>
using namespace std; const int N = 1e6+; int huaArr[N]; map<int,int> mapm; int n ,m; int cnt = ; int ans = 1e9;
int ansa = 1e9;
int ansb = 1e9; int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i =;i<= n;i++){
cin >> huaArr[i];
} int l = ; int r= ; for(int i =;i <=n;i++){
//i 幅画放去l r 区间
if (mapm[huaArr[i]] == )//曾经没有出现过
cnt++;
r++;
mapm[huaArr[i]]++; //开始进行缩减
while(mapm[huaArr[l]] >=){
//该副画 排除区间
mapm[huaArr[l]]--;
l++;
} if(cnt >= m && r-l+ < ans){
ans = r-l+;
ansa = l;
ansb = r;
}
} cout << ansa << " " << ansb << endl; return ;
}
tle
后面参考其他同学的代码 (https://www.acwing.com/blog/content/150/)
把自己的map改成了vector 过了。这也是 oj与leetcode的区别吧
#include <iostream>
#include <map>
#include <vector>
using namespace std; const int N = 1e6+; vector<int> huaArr(N,); vector<int> v(N,);
int n ,m; int cnt = ; int ans = 1e9;
int ansa = 1e9;
int ansb = 1e9; int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i =;i<= n;i++){
cin >> huaArr[i];
} int l = ; int r= ; for(int i =;i <=n;i++){
//i 幅画放去l r 区间
if (v[huaArr[i]] == )//曾经没有出现过
cnt++;
r++;
v[huaArr[i]]++; //开始进行缩减
while(v[huaArr[l]] >=){
//该副画 排除区间
v[huaArr[l]]--;
l++;
} if(cnt >= m && r-l+ < ans){
ans = r-l+;
ansa = l;
ansb = r;
}
} cout << ansa << " " << ansb << endl; return ;
}
ac
acwing 651. 逛画展的更多相关文章
- [洛谷P1638]逛画展
[洛谷P1638]逛画展 题目大意: 有\(n(n\le10^6)\)个格子,每个格子有一种颜色.颜色种数为\(m(m\le2000)\).求包含所有颜色的最小区间. 思路: 尺取法裸题. 思路: # ...
- 洛谷 P1638 逛画展 题解
P1638 逛画展 题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, ...
- P1638 逛画展(直尺法)
这道题是直尺法的模板题: #include<iostream> using namespace std; ; ; int n, m, a[maxn], vis[M]; int main() ...
- 【洛谷P1638】逛画展
题目大意:给定 N 个数字组成的序列,求刚好拥有所有 M 种数字的最短区间. 题解:双指针算法是一种对于暴力的优化算法,对于这道题来说,一个显然的暴力是:对于序列中每一个位置 pos,计算出这个位置右 ...
- 洛谷P1638逛画展
传送门啦 只需记录满足条件的一个区间的初始端点 $ (head, tail) $ ,不断删掉左端点 $ head $ ,不断更新右端点 $ tail $ : 开一个 $ vis[] $ 记录一下每幅画 ...
- Luogu P1638 逛画展 【二分答案】
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看 ...
- P1638 逛画展
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看 ...
- 【题解】P1638 逛画展-C++
原题传送门 思路这道题目可以通过尺取法来完成 (我才不管什么必须用队列)什么是尺取法呢?顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后 ...
- 洛谷P1638 逛画展 题解 尺取法/双指针/队列
题目链接:https://www.luogu.com.cn/problem/P1638 题目大意: 给你一个长度为 \(n (\le 10^6)\) 的数组,数组中每个元素的范围在 \(1\) 至 \ ...
随机推荐
- tf.nn.in_top_k的用法
tf.nn.in_top_k组要是用于计算预测的结果和实际结果的是否相等,返回一个bool类型的张量,tf.nn.in_top_k(prediction, target, K):prediction就 ...
- druid链接数据库
所用jar包 commons-beanutils-1.8.0.jarcommons-logging-1.1.3.jardruid-1.0.9.jarmysql-connector-java-5.1.1 ...
- vue - Error: Can't resolve '@/assets/img/github.svg (vue-cli3.0,无法解析.svg图片,已解决)
用vue脚手架(vue-cli3.0)生成的目录,无法解析.svg图片的问题 <img src="@/assets/img/github.svg" alt="git ...
- 产品经理如何使用 CODING 进行项目规划
CODING 为您的企业提供从概念到软件开发再到产品发布的全流程全周期软件研发管理,为您的研发团队提供全程助力,帮助研发团队捋清需求.不断迭代.快速反馈并能实时追踪项目进度直到完成.同时 CODING ...
- 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰
Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下: def decorate ...
- 给定数轴上的n个点,求距离最近的两个点的距离
public class MinimumSpacing { //给定平面上的n个点,求距离最近的两个点的距离. //无从下手的话,先分解问题,分解成简单的,逐个分析,然后再合在一起考虑 //这是个2维 ...
- 《Web Development with Go》Middleware之使用codegangsta.negroni
这个第三方库,使用自定义中间件时, 语法就感觉流畅很多. package main import ( "fmt" "log" "net/http&qu ...
- 二维数组中的查找(剑指offer_4)
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序.给定一个数,判断这个数是否在该二维数组中. Consider the following matrix: [ [1, 4, 7, 11 ...
- java之集合(Set、List、Map)
java集合类存放于java,uti包中,是一个用于存放对象的容器. 集合只能存放对象,比如存入的是int型数据1,那么它会自动转换成Integer包装类后再存入: 集合存放的是多个对象的引用,对象本 ...
- Python time.time()方法
描述 Python time time()返回当前时间的时间戳. 时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(背景时间1970年01月01日08时00分00秒)起至现在的总 ...