首先,根据输入格式将数据保存在一个动态开辟的数组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;
}

京公网安备 11010502036488号