问题描述:
在数列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;
}
测试:
写在末尾:仔细读题,,,仔细读题,,,仔细读题,,,千万别把样例说明看成输出格式了呀