1.朴素算法
完全没必要把新数赋给word【0】然后所有数往后移一位,
把【0】位想象成动态的才是较优解法
维护一个“内存”数组,
从前往后循环插数,
多的直接覆盖掉,
每次覆盖答案加一
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1100;
int txt[MAXN];
int word[MAXN / 10];
int ans = 0;
int main()
{
memset(txt, -1, sizeof(txt));//初始化
memset(word, -1,sizeof(word));
int m, n;
cin>>m>>n;
for(int i = 0; i < n; i++)
{
cin>>txt[i];
}
int flag = 0;
for(int i = 0; i < n; i++)
{
bool exct = false;
for(int j = 0; j < m; j++)//查存在
{
if(word[j] == txt[i])
{
exct = true;
break;
}
}
if(!exct)//循环插数
{
word[flag++] = txt[i];
ans ++;
if(flag == m)
flag = 0;
}
}
cout<<ans<<endl;
return 0;
}
2.stl容器
find 查询 erase删除开始位 size查是否溢出
操作便利直观
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector <int> word;//申请容器
int m, n, tmp, ans = 0;
cin>>m>>n;
for(int i = 0; i < n; i++)
{
cin>>tmp;
if(find(word.begin(), word.end(), tmp) == word.end())//如果没查到
{
word.push_back(tmp); //向后插入
ans ++;
}
if(word.size() > m) //插入后若溢出
{
word.erase(word.begin()); //删除头部
}
}
cout<<ans<<endl;
return 0;
}