题目传送门
题意
n个数字,两种操作
- 相邻两个数加1
- 一个数加2
问能不能根据这些操作构成这些数字
分析
贪心一下,能放2就放2,所以偶数转成2,奇数转成1,0还是0
遍历一遍
- 如果当前是1,则下一个数减1,再判断下一个数是否小于0
- 如果当前是2,直接减2
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<iostream> #include<cstring> #include<algorithm> #define MAXN 200005 using namespace std; int num[MAXN]; int main() { int n; int flag; while (cin >> n) { flag = 0; for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); if (num[i] != 0) { if (num[i] % 2) num[i] = 1; else num[i] = 2; } } for (int i = 1; i < n; i++) { if (num[i] == 1) { num[i]--; num[i + 1]--; if (num[i + 1] < 0) { flag = 1; break; } } else if (num[i] == 2) { num[i] -= 2; } } if (num[n] == 1) flag = 1; if (flag) cout << "NO" << endl; else cout << "YES" << endl; } return 0; }
|