思路
大水题,只需要静下心来模拟就行。我一开始做的时候,首先想到滚动数组但是写完之后发现并不符合题目要求。题目要求新加入的单词作为最新的,在时间上属于最后一个。但是如果用滚动数组的话,新加入的单词就成了第一个加入的单词。也就是说会WA。所以直接模拟是最好的办法。每次超出内存后,将每个元素的下标都往前推一格。空出最后一格给新加入的单词
代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n, m, data[108], temp, ans, now; bool vis[1008]; int main() { scanf("%d%d", &m, &n); memset(data, -1, sizeof(data)); for(int i=1; i<=n; i++) { scanf("%d", &temp); if(!vis[temp]) { vis[temp] = 1; if(now == m) { if(data[1] != -1) vis[data[1]] = 0; for(int j=2; j<=m; j++) data[j-1] = data[j]; data[m] = temp; } else { data[++now] = temp; } ans ++; } } printf("%d", ans); }