【問題描述】
在數列 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>
#define N 1000
int main()
{
int n,i,j,k,p,q;
int s = 0;
char a[N];
scanf("%d",&n);
for(i = 0;i < n;i ++)
scanf("%d",&a[i]);
for(i = 1;i < n - 1;i ++)
{
p = q = 0;
for(j = i - 1;j >= 0;j --)
{
if(a[j] < a[i])
{
p = 1;
break;
}
}
for(k = i + 1;k < n; k++)
{
if(a[k] > a[i])
{
q = 1;
break;
}
}
if(p == 1 && q == 1)//如果都存在,則s++;
s ++;
}
printf("%d",s);
return 0;
}
【我當時是這樣想的,枚舉三個,再判斷,
for(int i = 0;i < n; i ++)
for(int j = 0;j < n;j ++)
for(int k = 0;j < n;j ++)
{
if(i < j && j < k)
if(a[i] < a[j] && a[j] < a[k])
s ++;
}
/*如果輸入的是
5
1 2 5 3 5
那麼就會有三種情況:
1 2 5
1 2 3
2 3 5
然後還要考慮中心數重複的問題
(OMG)簡直複雜的要死,而且時間複雜度是O(n^3)】