题解 P2088 【果汁店的难题】
非常抱歉,管理员同志,刚刚代码交错了,可以帮忙把楼下那篇删掉吗?不胜感激。
贪心的思路为:当我们所有榨汁机都没有清洗时我们要选之后出现最晚的进行清洗。
模拟:案例一波堆模拟的做法,对于优先级比较高的,无脑压入堆,每次取出优先级最高的(出现最晚的)进行清洗,当堆顶为一个已经无效的元素时,直接丢弃。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,las[205],nex[205],used[205],ans,num[205];
struct zt
{
int ys,yxj;
bool operator < (const zt &a) const
{
return a.yxj > yxj;
}
};
priority_queue<zt>q;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i ++)
scanf("%d",&num[i]);
memset(las,0x3f,sizeof(las));
for(int i = m;i >= 1;i --)
{
nex[i] = las[num[i]];
las[num[i]] = i;
}
for(int i = 1;i <= m;i ++)
{
if(used[num[i]]) {q.push((zt){num[i],nex[i]});continue;}
if(q.size() >= n)
{
while(!q.empty()&&!used[q.top().ys]) q.pop();
ans ++;
if(!q.empty()) used[q.top().ys] = 0,q.pop();
else ans --;
}
q.push((zt){num[i],nex[i]});
used[num[i]] = 1;
}
printf("%d",ans);
}