f820 - 極限運動 (Sports)
題目描述
題目給定一個整數陣列,以及一個起始索引 t。目標是找到陣列中,從起始索引 t 出發,向左或向右移動,直到遇到一個比當前位置值更小的值時停止的位置。如果向左或向右移動遇到相同的值,則繼續移動。最後輸出停止位置的索引。
解題思路
這個問題可以使用貪心演算法解決。首先,比較起始位置的左右鄰居的值。如果左鄰居大於右鄰居,則向左移動,直到遇到比當前位置值更小的值。反之,如果右鄰居大於左鄰居,則向右移動,直到遇到比當前位置值更小的值。在移動過程中,如果遇到與當前位置值相同的值,則繼續移動。為了避免邊界問題,在陣列的頭部和尾部添加了哨兵值 100001。
複雜度分析
- 時間複雜度: O(n)
- 空間複雜度: O(1)
程式碼
#include <iostream>
using namespace std;
int a[32],n,t,tmp;
int main(){
cin >> n;
for(int i=1;i<=n;++i)
cin >> a[i];
cin >> t;
tmp = a[t];
a[0]=a[n+1]=100001;
if(a[t+1]>a[t-1])
while(a[t]>=a[t-1])
--t;
else
while(a[t]>=a[t+1])
++t;
cout << t;
}