题意
有一个图书馆,刚开始没书,最多可容纳k本书,有n天,每一天会有一个人来借一本书,当天归还,如果图书馆里有,就可以直接借到,否则图书馆的人会购进这一本书,任何一本书价格都是1,如果现在图书馆存书已达上限且还需购买,则必须先舍弃一些书,再购买,问图书馆的人最少需要花多少钱购书
思路
贪心,对于每一天要借的书,如果现在图书馆里有,就不用管了,如果没有,考虑现有书的数量,如果小于k,就直接购进这一本书,否则,先舍弃掉已有的书中下一次出现最晚的书,然后再购进这一本书,每一天都处理完后购进的总次数就是答案
代码
#include <cstdio>
int a[81];
bool used[81];
int e[81];
int main()
{
int n,k,cnt,maxx,maxi,ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cnt=0;
for(int i=1;i<=n;i++)
{
if(used[a[i]])
continue;
if(cnt<k)
{
cnt++;
used[a[i]]=true;
ans++;
}
else
{
for(int j=1;j<=n;j++)
e[j]=0;
for(int j=1;j<=n;j++)
if(used[j])
e[j]=100;
for(int j=1;j<=n;j++)
if(used[j])
{
for(int k=i+1;k<=n;k++)
if(a[k]==j)
{
e[j]=k;
break;
}
}
maxx=0;
maxi=-1;
for(int j=1;j<=n;j++)
if(e[j]>maxx)
{
maxx=e[j];
maxi=j;
}
used[maxi]=false;
used[a[i]]=true;
ans++;
}
}
printf("%d\n",ans);
return 0;
}