题目如下。提交后只有91分,错了一步。请大大们帮忙更正,谢谢!
===================================================
Description
博览馆正在展出由世上最佳的M位画家所画的图画。人们想到博览馆去看这几位大师的作品。
可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b, 代表要看展览中的第a幅至第b幅画(包含a和b)之间的所有图画,而门票的价钱就是一张图画 一元。
人们希望入场后可以看到所有名师的图画(至少各一张)。
可是又想节省金钱……请你写一个程序决定购买门票时的a值和b值。
Format
Input
第一行是N和M,分别代表博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。
其后的一行包含N个数字,它们都介于1和M之间,代表该位名师的编号。
N<=1000000
M<=2000
Output
a和b(a<=b)由一个空格符所隔开。
保证有解,如果多解,输出a最小的。
===========================================
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() { //博览购票(hashmap)
int N, M;
cin >> N >> M;
int num[N];
for (int i = 0; i < N; ++i) {
cin >> num[i];
}
int a = 0, b = 0;
int start(0), end(0), length(N);
unordered_map<int, int> hash;
while (end < N) {
int tmpNum = num[end];
hash[tmpNum]++;//添加元素到hash并累加赋值表示出现次数
end++; //右指针右移
while ((int)hash.size() == M) { //窗口全部覆盖所有画家
if (length > ( end - start)) {
length = end - start;
a = start + 1;
b = end;
}
if (hash[num[start]] == 1) hash.erase(num[start]);
else hash[num[start]]--;
start++;
}
}
cout << a << " " << b << endl;
return 0;
}
提交后截图如下: