使用最佳页面置换算法求解.
#include<stdio.h>
#include<string>
#include<cstring>
#include<queue>
#include<algorithm>
#include<functional>
#include<vector>
#include<iomanip>
#include<math.h>
#include<iostream>
#include<sstream>
#include<stack>
#include<set>
#include<bitset>
using namespace std;
const int MAX=10005;
const int INF=0x3f3f3f3f;
int T,K,N;
int A[MAX];
int Temp[MAX];
int Next[MAX];
bool In[MAX];
int Pos[MAX];
set<int> V;
int main()
{
cin.sync_with_stdio(false);
cin>>T;
while (T--)
{
memset(Temp,0,sizeof(Temp));
memset(Next,INF,sizeof(Next));
memset(In,0,sizeof(In));
memset(Pos,0,sizeof(Pos));
V.clear();
cin>>K>>N;
for (int i=1; i<=N; i++)
cin>>A[i];
for (int i=N; i>=1; i--)
{
if (Temp[A[i]])
Next[i]=Temp[A[i]];
Temp[A[i]]=i;
}
/*
for (int i=1; i<=N; i++)
cout<<setw(3)<<i;
cout<<endl;
for (int i=1; i<=N; i++)
cout<<setw(3)<<A[i];
cout<<endl;
for (int i=1; i<=N; i++)
if (Next[i]==INF)
cout<<setw(3)<<'!';
else
cout<<setw(3)<<Next[i];
cout<<endl;
*/
int Size=0,Ans=0;
for (int i=1; i<=N; i++)
{
if (!In[A[i]])
{
Ans++;
if (Size<K)
{
V.insert(A[i]);
//cout<<i<<" Insert "<<A[i]<<endl;
In[A[i]]=true,Size++;
}
else
{
int Max=0,Index=0,j;
for (set<int>::iterator it=V.begin(); it!=V.end(); it++)
{
j=*it;
if (Next[Pos[j]]>Max)
Max=Next[Pos[j]],Index=j;
}
In[Index]=false;
V.erase(Index);
//cout<<i<<" Erase "<<Index<<" And Insert "<<A[i]<<endl;
V.insert(A[i]);
In[A[i]]=true;
}
}
Pos[A[i]]=i;
}
cout<<Ans<<endl;
}
return 0;
}