各位大佬,我有个想法来实现这个题,就是滑动窗口去重加上滑动次数
注意!!!以下想法仅仅理论成立,代码部分有bug,具体bug是deque的溢出风险,因为pop了元素,所以后续访问必溢出,主包尝试改动,但能力有限,望周知
step1:去重(找每个数前N个数是否有一样的)
1,2,1(弹出),5,4,4(弹出),1 |
1,2,5,4,1(弹出两个数count=2) |
for(int line = 0;line<M;line++)
{
int input;std::cin>>input;
due.push_back(input);
int step=std::max((int)line-N,0);
int mark=0;
for(int endWin=std::max(line-mark-1,0);endWin>step;endWin--)
{
if(due[line-mark]==due[endWin])
{
due.pop_back();
mark++;
count++;
break;
}
}
}
step2:计算滑动次数(窗口大小为“3”)
滑动3次count+3=5
count+=(due.size()>N? due.size()-N+1:due.size());
以下代码是主包正确AC解法
#include<iostream>
#include<deque>
#define NT std::endl
int main() {
int N, M;
std::cin >> N >> M;
if (N == 0) {
std::cout << 0;
return 0;
}
std::deque<int>deq;
int input, count = 1;
std::cin >> input; M--; deq.push_back(input);
while (M-- > 0){
bool judge = false;
std::cin >> input;
for (int i = 0; i < deq.size(); i++) {
if (deq[i] == input) {
judge = true;
break;
}
}
if (judge == false) {
if (deq.size() == N) {
deq.pop_front();
deq.push_back(input);
count++;
}
else {
deq.push_back(input);
count++;
}
}
judge = false;
}
std::cout << count;
}

京公网安备 11010502036488号