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;
}