传送门
我觉得这个题特别水啊,就是自己不会写而已
只要想到每三个连续的可以转化,这题就差不多了
所以每种连续的最多出现2次,直接dp就行了
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e6+10;
int n,m,a[maxn],b[maxn],f[maxn][3][3],ans;
int main()
{
read(n),read(m);
for(rg int i=1;i<=n;i++)read(a[i]),b[a[i]]++;
for(rg int i=1;i<=m;i++)
for(rg int x=0;x<=2;x++)
for(rg int y=0;y<=2;y++)
for(rg int z=0;z<=2;z++)
if(b[i]>=x+y+z)f[i][x][y]=max(f[i][x][y],f[i-1][z][x]+(b[i]-x-y-z)/3+y);
printf("%d
",f[m][0][0]);
}