C語言:藍橋杯-第十一屆校模擬賽:遞增三元組(我沒想到的思路)

【問題描述】
在數列 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)】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章