C语言 校内模拟赛 找三元组中心(在数列a[1],a[2],...,a[n]中,)

问题描述:

在数列a[1],a[2],…,a[n]中,如果对于下标i,j,k满足0<i<j<k<n+1且a[i]<a[j]<a[k],则称a[i],a[j],a[k]为一组递增三元组,a[j]为递增三元组得中心。给定一个数列,请问数列中有多少个元素可能是递增三元组得中心。

输入格式:
       输入得第一行包含一个整数n。
       第二行包含n个整数a[1],a[2],…,a[n],相邻得整数间用空格分隔,表示给定的数列。

输出格式:
       输出一行包含一个整数,表示答案。

样例输入:
5
1 2 5 3 5

样例输出:
2

样例说明:
       a[2]和a[4]可能是三元组的中心。

评测用例规模与约定:
       对于50%的评测用例,2<=n<100,0<=数列中的数<=1000.。
       对于所有评测用例,2<=n<=1000,0<=数列中的数<=10000。

解题思路:顺着遍历,先找递增三元组,再记录中心的下标,有个注意点就是若两个三元组中心是同一个元素,那么只要统计一次。

代码:

#include<stdio.h>

int main()
{
	//先把该定义的都给定义了 
	int n;
	scanf("%d",&n);
	int a[n];
	int i,j,k;
	int count=0;
	int c=-1;//标记变量c,以防两个中心下标一样搞重了 
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);	
	}
	//三重循环,用来判断递增 
	for(i=0;i<n-2;i++)
	{
		for(j=i+1;j<n-1;j++)
		{
			for(k=j+1;k<n;k++)
			{
				if(a[i]<a[j]&&a[j]<a[k])
				{
					//判断这个j之前有没有被统计过,c存储上一个满足条件的下标 
					//由于是顺着向后找的,所以只需要和之前那个比较即可 
					if(c!=j) 
					{
						c=j;
						count++;
					}
				}
			}
		}
	}	
	printf("%d",count);
	return 0;
}

测试:
在这里插入图片描述
写在末尾:仔细读题,,,仔细读题,,,仔细读题,,,千万别把样例说明看成输出格式了呀

发布了6 篇原创文章 · 获赞 3 · 访问量 559

猜你喜欢

转载自blog.csdn.net/qq_45556278/article/details/104977364
今日推荐