3. 序列I
题目ID:11050必做题100分
最新提交:
Wrong Answer
60 分
历史最高:
Wrong Answer
60 分
时间限制: 1000ms
空间限制: 524288kB
题目描述
给定一个序列 a=a[1],a[2],…,a[n]
有以下两种操作:
1.若a[i] = a[i+1],则可将a[i]与a[i+1]同时加1
2.将a[i]加2
求问是否可经过多次操作后使得所有a[i]相等。
输入格式
第一行,一个正整数T,代表数据组数。
接下来T*2行,每两行一个数据,其中第一行一个正整数n代表序列长度,第二行n个正整数。
输出格式
共T行,每行"YES"或者"NO"代表是否可行。
样例
Input 1
4 5 2 1 1 2 5 3 4 5 3 2 10 10 3 1 2 3
Output 1
YES
YES
YES
NO
Input 2
2 8 3 2 5 8 4 1 14 11 7 3 7 4 2 13 6 5
Output 2
YES
NO
样例解释
第一组:
在第一个数据中,可以在第2个元素和第3个元素上加一得到[2,2,2,2,5],然后在第1个元素和第2个元素三次加一,在第3个元素和第4个元素 三次加一得到 [5,5,5,5,5]。
在第二个数据中,可以在第3个元素加二得到 [4,5,5],然后在第2个元素和第3个元素加一得到 [4,6,6],最后在第1个元素加二得到[6,6,6]。 在第三个数据中,已经完成。
第二组:
[3 2 5 8 4 1 14 11] → [3 2 9 8 8 9 14 11] → [3 2 9 9 9 9 14 11] → [3 14 9 9 9 9 14 11] → [3 14 14 14 14 14 14 11] → [15 14 14 14 14 14 14 15] → [15 15 15 15 15 15 15 15]
数据范围
对于60%的数据 T = 1, 1 <= n <= 10
对于100%的数据 1 <= T <= 10, 1 <= n <= 200000
本帅哥的代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
stack <int> xl;
for (int i = 1; i <= n; i++) {
int chishi;
cin >> chishi;
if (xl.empty()) {
xl.push(chishi);
} else if (chishi == xl.top()) {
xl.pop();
} else {
xl.push(chishi);
}
}
if (xl.size() == 0 || xl.size() == 1) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}