文章目录
1. 题目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 524288 kB
1.2. Problem Description
蜗牛在制定今天的旅游计划,有 n n n 个景点可选,它已经把这些景点按照顺路游览的顺序排成一排了,每个地方有相应的景观,这里用一个整数表示。
蜗牛希望选取连续的一段景点,还要选出来的每一个景点的景观都不同,问它最多能选出多少个景点进行旅游。
1.3. Input
第一行,一个正整数 n n n ( 1 ≤ n ≤ 1 0 5 ) (1 \le n \le 10^5) (1≤n≤105)
第二行,包含 n n n 个正整数 a i ( 1 ≤ a i ≤ 1 0 6 ) a_i(1 \le a_i \le 10^6) ai(1≤ai≤106),第 i i i 个整数表示第 i i i 个景点的景观。
1.4. Output
输出一行,包含一个整数,表示蜗牛最多能选出的景点数。
1.5. Sample Input
5
1 2 3 2 1
1.6. Sample Output
3
1.7. Source
2. 解读
STL基本使用。
使用 queue
对每个元素都不同的序列进行存储。依次遍历每个元素,若元素
a
i
a_i
ai 与队列中的所有元素都不相等,则
a
i
a_i
ai 入队。
若队列中存在与 a i a_i ai 相等的元素,队首出队,直到队列中没有与 a i a_i ai 相等的元素, a i a_i ai 入队。
在每次入队操作完全以后,计算队列的长度,在最后输出队列长度的最大值。
3. 代码
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
const int NUM = 1e6 + 1;
// 队列存储最长不同序列
queue<long long> qu;
// 存储值
long long list[NUM];
// 标志值是否在队列中
bool markList[NUM];
int main()
{
// test case
long long t;
scanf("%lld", &t);
// 初始化
memset(list, 0, sizeof(list));
memset(markList, 0, sizeof(markList));
// 输入buffer
long long buffer;
// 最大值
size_t max = 0;
// 输入
for (int i = 0; i < t; i++) {
scanf("%lld", &buffer);
list[i] = buffer;
}
// 判断
for (int i = 0; i < t; i++) {
// 判断是否在队列中
if (markList[list[i]] == 0) {
// 若不在,加入队列
qu.push(list[i]);
// 标记数字
markList[list[i]] = 1;
} else {
// 若在,将队首元素出队直到没有元素和即将新入队的元素重复
while (markList[list[i]] != 0) {
markList[qu.front()] = 0;
qu.pop();
}
// 加入队列
qu.push(list[i]);
// 标记数字
markList[list[i]] = 1;
}
// 存储最长队列
if (qu.size() > max) {
max = qu.size();
}
}
// 输出
printf("%lld\n", max);
}
联系邮箱:curren_wong@163.com
Github:https://github.com/CurrenWong
欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。