CodeForces 802A Heidi and Library (easy)(思维、难)

题目链接:CodeForces 802A Heidi and Library (easy)
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;
}