首先,根据输入格式将数据保存在一个动态开辟的数组a[n]中;

如果n<4必然一个“三带一”都没有,直接输出“0”,并返回;

“三带一”即在4个位置中选一个和其他三个不同,所以就4种情况;

后面处理大于4:

第一个循环用i遍历数组a,循环内开辟数组t[3]记录a[i]后三个位置的数是否和a[i]相同,all=t[0]+t[1]+t[3],如果all==2说明有两个数和a[i]相同并且有一个数和a[i]不同(满足“三带一”),count++,i+=3(注意循环结束还会加1,正好跳过已记录的“三带一”);如果all==0,有后面三个都相同的情况,检查后三个数是否都相等,是:就满足“三带一”,count++,i+=3;其他情况就继续往后遍历;(特殊情况:如1 1 1 9 9 9有两种组合但记录完前一个,指针i就会跳到第二个9的位置,不会多记录)

最后输出count;

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d",&n);
    int *a=(int *)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(n<4)
    {
       printf("0");
       return 0; 
    }
    int count=0;
    int i=0;
    for(i=0;i<n-3;i++)
    {
        int t[3]={0};
        for(int j=i+1,k=0;j<=i+3;j++,k++)
        {
            if(a[i]==a[j])t[k]++;
        }
        int all=t[0]+t[1]+t[2];
        if(all==2)
        {
            i+=3;
            count++;
        }
        if(all==0&&a[i+1]==a[i+2]&&a[i+2]==a[i+3])
        {
            i+=3;
            count++;
        }
    }
    free(a);
    printf("%d",count);
    return 0;
}