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
复制代码

 

posted on   itdef  阅读(203)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示