题目
http://codeforces.com/contest/1375/problem/C
思路
由于满足 a i < a i + 1 a_i < a_{i+1} ai<ai+1的序列才能被消除,所以我们尽可能让前面的数字更小。
从左往右依次考虑每一个数字。
假如
a
1
<
a
2
a_1 < a_2
a1<a2,则保留
a
1
a_1
a1,于是变成
a
1
a_1
a1和
a
3
a_3
a3的比较,和
a
1
a_1
a1与
a
2
a_2
a2的比较同理。
假如
a
1
>
a
2
a_1 > a_2
a1>a2,则一直往后,找到第一个满足
a
k
>
a
1
a_k > a_1
ak>a1的数。由于
a
2
,
.
.
.
,
a
k
−
1
a_2, ..., a_{k-1}
a2,...,ak−1之间的数都比
a
k
a_k
ak要小(因为
a
k
>
a
1
>
a
2
a_k > a_1 > a_2
ak>a1>a2且
a
k
a_k
ak是第一个比
a
1
a_1
a1大的),则从
a
k
a_k
ak开始从右往前比较,并且总是保留
a
k
a_k
ak,最后就变成
a
1
a_1
a1和
a
k
a_k
ak的比较。由于已经知道
a
k
>
a
1
a_k > a_1
ak>a1,所以保留
a
1
a_1
a1,变成
a
1
a_1
a1与
a
k
+
1
a_{k+1}
ak+1的比较,和
a
1
a_1
a1与
a
2
a_2
a2的比较同理。假如没有找到满足要求的
a
k
a_k
ak,即
a
1
a_1
a1大于它之后的所有数,则最后无法消除。
所以我们要么
- 直到最后一个元素发现 a 1 > a n a_1 > a_{n} a1>an,也找不到 a k a_k ak。于是答案NO。
- 找到满足条件的 a k a_k ak,把 a 2 a_2 a2到 a k a_k ak的元素全部消除。消除到最后,变成 a 1 a_1 a1和 a n a_{n} an的比较。所以我们发现,只要最后一个数 a n a_{n} an大于 a 1 a_1 a1,则我们总可以消除到只有一个元素。
解法:
只需要比较
a
1
a_1
a1和
a
n
a_{n}
an的大小。如果
a
1
>
a
n
a_1 > a_{n}
a1>an,则NO,否则YES。
note: 这里把数组画在坐标系上会更容易理解。
代码
代码均为提交通过版本。为保持比赛时原样,没有后期优化或者修改。但为方便阅读,可能会增加注释。
#include <iostream>
using namespace std;
int main() {
int tcase;
std::ios::sync_with_stdio(false);
cin >> tcase;
while(tcase--) {
int n;
cin >> n;
int first, last;
for(int i = 0; i < n; i++) {
int x;
cin >> x;
if (i == 0) {
first = x;
} else if (i == n - 1) {
last = x;
}
}
if (first < last) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}