CF729E Solution

题目链接

题解

可以发现\(a\)序列的目标状态一定是从\(0\)开始的连续的(\([0,k]\)间每个数均出现过)序列。因此用\(pos\)数组记录每个\(a_i\)值出现的次数,从前向后遍历每个员工。如果出现\(pos[i]=0\)\(ans+1\),并从未统计的员工中选一个填补空缺,直至所有员工均被统计。此外,如果下标为\(a_s\not=0\),则需要将\(a_s\)变更为\(0\)

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],pos[N];
int main()
{
	int n,s,ans=0,sum=1;
	scanf("%d%d",&n,&s);
	for(int i=1;i<=n;i++) 
	{
		scanf("%d",&a[i]); 
		if(i==s && a[i]!=0) ans++;
		else pos[a[i]]++;
	}
	for(int i=1;sum<n;i++) {sum+=max(1,pos[i]); ans+=(!pos[i]);}
    //a[s]=0的情况已处理,a[i]=0(i!=s)的情况被用来填补空缺,因此sum<n且i>=1
	printf("%d",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/violetholmes/p/14501890.html