求助!【尺取法】博览购票——哪一步错了?

文章讲述了如何编写一个程序,根据给定的画家编号分布,确定在购买博览馆门票时,选择最少花费以确保看到每位大师至少一幅画的a值和b值。
摘要由CSDN通过智能技术生成

题目如下。提交后只有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;
}

提交后截图如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值