CF1176C Lose it!

思路

定义一个数组能分为若干份,每一份都是 \(4,8,15,16,23,42\) 的前缀的数组是 半优秀 的。

容易发现只有满足以下性质的数组才是 半优秀

\(j\) 在数组的 \([1,i]\) 中出现的次数为 \(num_{i,j}\),对于每一个 \(i(1\leq i\leq n)\),都存在 \(num_{i,j_1}\leq num_{i,j_2},(j_1 \geq j_2)\)

那么,如果一个数的出现,使目前的数组不是 半优秀 的,那么它一定会使整个数组不是 优秀 的,所以需要删去。

最后的出的数组中,只需要把所有多余的 \(4,8,15,16,23\) 删去就是 优秀 的数组了。

那么,最后剩下的数的数量就是 \(6 \times num_{n,42}\)

只需要用 \(n\) 减去剩下的数的数量,就可以得出答案。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,a[500005],num[7];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=n;++i)
	{
		int k=(a[i]==4)?1:(a[i]==8)?2:(a[i]==15)?3:(a[i]==16)?4:(a[i]==23)?5:6;
		if(k==1){++num[k];continue;}
		if(num[k]+1>num[k-1]) continue;
		else ++num[k];
	}
	printf("%d",n-num[6]*6);
	return 0;
}
posted @ 2023-08-22 20:15  One_JuRuo  阅读(7)  评论(0编辑  收藏  举报