1. 程式人生 > 實用技巧 >【Codeforces Global Round 9 C】Element Extermination

【Codeforces Global Round 9 C】Element Extermination

題目連結

點我呀

翻譯

給你一個排列,你每次可以將 \(a[i]<a[i+1]\) 中的 \(a[i]\) 或者 \(a[i+1]\) 刪掉。

問你,最後能不能刪得只剩下 \(1\) 個元素。

題解

考慮最大的元素 \(n\), 想想它是不是能一直往左刪元素?

但是刪到第一個元素的時候,就不能再刪了,因為 \(n\) 可能不是最後一個元素,如果再刪的話,就沒有

其他元素能刪掉 \(n\) 了, 沒辦法這個時候只能保留第一個元素然後把 \(n\) 給刪掉了。

然後接著找 \(n\) 右邊的次大的元素 \(x\) (\(n\) 左邊只剩第一個數字了),也重複進行刪除元素操作。

如果 \(x\)

不是最右邊那個元素的話,仍然不能刪掉第一個元素... 依次類推

不難發現,只要排列的最後一個元素是大於第一個元素的,那麼最後一定能輪到這個 \(a[n]\) 進行這樣的

步驟,就能刪掉第一個元素,只剩一個元素 \(a[n]\) 啦。

如果最後一個元素小於第一個元素,根據上面的過程可以發現,第一個元素沒辦法被刪除。

神奇的一道題。

程式碼

#include <cstdio>
using namespace std;
 
const int N = 3e5;
 
int T, n;
int a[N + 10];
 
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        for (int i = 1;i <= n; i++){
            int x;
            scanf("%d",&a[i]);
        }
        if (a[n] > a[1]){
            puts("YES");
        }else{
            puts("NO");
        }
    }
    return 0;
}