CodeForces 802A Heidi and Library (easy)(思维、难)
题目链接:CodeForces 802A Heidi and Library (easy)
【题意】
有一个图书馆,刚开始没有书,最多可容纳k本书;有n天,每天会有人借一本书,当天归还;如果图书馆有这个本就直接借到,否则图书馆的人会购买这本书,每本书的价格都是1;如果现在图书馆的书已达上限还需购买,必须舍弃已有的一本书,以后再有人借这本书要重新购买。
【分析】
问题的核心便是当已经有k本书而又要购入新书时要丢弃哪一本书。
贪心,当需要扔书时,优先扔后面已经不需要的书,当后面没有不需要的书的时候,优先扔需要被用到的时间最晚的书。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 85;
const int INF = 0x3f3f3f3f;
int vis[maxn];
int num[maxn];
int nxt[maxn];
int a[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
}
int ans = 0;
int cnt = 0;
for(int i=1;i<=n;i++)
{
num[a[i]]--;
if(vis[a[i]]==0)
{
ans++;
if(cnt<k)
{
cnt++;
}
else
{
int index = 0;
for(int j=1;j<i;j++) //优先扔后面已经不需要的书
{
if(vis[a[j]]==1&&num[a[j]]==0)
{
index = a[j];
break;
}
}
if(index==0) //扔需要被用到的时间最晚的书
{
memset(nxt,0,sizeof(nxt));
for(int j=i+1;j<=n;j++)
{
if(vis[a[j]]==1&&nxt[a[j]]==0)
{
index = a[j];
nxt[a[j]] = 1;
}
}
}
vis[index] = 0;
}
vis[a[i]]=1;
}
}
printf("%d\n",ans);
return 0;
}