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 最小的那个解。

数据范围

1N1061≤N≤106,
1M20001≤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+10;

int huaArr[N];

map<int,int> mapm;

int n ,m;

int cnt = 0;

int ans = 1e9;
int ansa = 1e9;
int ansb = 1e9;


int main()
{
     ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i =1;i<= n;i++){
        cin >> huaArr[i];
    }
    
    int l = 1; int r= 0;
    
    for(int i =1;i <=n;i++){
        //i 幅画放去l r 区间
        if (mapm[huaArr[i]] == 0)//曾经没有出现过
            cnt++;
        r++;
        mapm[huaArr[i]]++;
        
        //开始进行缩减
        while(mapm[huaArr[l]] >=2){
            //该副画 排除区间
            mapm[huaArr[l]]--;
            l++;
        }
        
        if(cnt >= m && r-l+1 < ans){
            ans = r-l+1;
            ansa = l;
            ansb = r;
        }
    }
    
    cout << ansa << " " << ansb << endl;
    
    
    return 0;
}
tle

 

后面参考其他同学的代码  (https://www.acwing.com/blog/content/150/

把自己的map改成了vector  过了。这也是 oj与leetcode的区别吧 

 1 #include <iostream>
 2 #include <map>
 3 #include <vector>
 4 using namespace std;
 5 
 6 const int N = 1e6+10;
 7 
 8 vector<int> huaArr(N,0);
 9 
10 vector<int> v(N,0);
11 int n ,m;
12 
13 int cnt = 0;
14 
15 int ans = 1e9;
16 int ansa = 1e9;
17 int ansb = 1e9;
18 
19 
20 int main()
21 {
22      ios::sync_with_stdio(false);
23     cin >> n >> m;
24     for(int i =1;i<= n;i++){
25         cin >> huaArr[i];
26     }
27     
28     int l = 1; int r= 0;
29     
30     for(int i =1;i <=n;i++){
31         //i 幅画放去l r 区间
32         if (v[huaArr[i]] == 0)//曾经没有出现过
33             cnt++;
34         r++;
35         v[huaArr[i]]++;
36         
37         //开始进行缩减
38         while(v[huaArr[l]] >=2){
39             //该副画 排除区间
40             v[huaArr[l]]--;
41             l++;
42         }
43         
44         if(cnt >= m && r-l+1 < ans){
45             ans = r-l+1;
46             ansa = l;
47             ansb = r;
48         }
49     }
50     
51     cout << ansa << " " << ansb << endl;
52     
53     
54     return 0;
55 }
ac

 

转载于:https://www.cnblogs.com/itdef/p/10858238.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值