目录
题目
Description
又是北湖深坑,惊不惊喜,意不意外?!
觉得用水填湖太没意思了,用石头填坑多有意思。
假设北湖的地面还是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。
现提供不限量的 规格的石头,问是否可以将北湖填平。(所有地面到达同一高度即为填平)
注:石头只能水平或垂直填放。
Input
样例有多组输入至文件末尾;
每组用例占两行;
第一行输入1个整数 表示北湖地面总宽度;
第二行输入 个整数 ,用空格间隔,表示地面高度。
Output
若能填平则输出“YES”,否则输出“NO”。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路
- 初始化一个空栈和一个向量来存储地面的高度。
- 对于输入数组中的每个元素,执行以下操作:
a. 如果栈为空或栈顶元素与当前高度的绝对差是奇数,则将当前高度推入栈中。
b. 如果栈顶元素与当前高度的绝对差是偶数,则弹出栈顶元素。 - 处理完所有元素后,如果栈的大小大于1,则输出"NO"(表示无法填满湖),否则输出"YES"(表示可以填满湖)。
注意事项
- 代码使用栈来跟踪地面的高度,因为当一个石头水平放置时,它填充了相邻的两个地面元素,所以高度差必须是偶数。当一个石头垂直放置时,它只填充了一个地面元素,所以高度差必须是奇数。
- 代码使用取模运算符(%)来检查高度差是偶数还是奇数。
- 代码使用abs()函数来计算两个高度之间的绝对差。
C++完整代码(含详细注释)
#include <iostream>
#include <stack>
#include <vector>
#include <cmath> // 使用 abs() 函数
using namespace std;
int main() {
int t;
cin >> t; // 读取测试用例的数量
while (t--) { // 遍历每个测试用例
int n;
cin >> n; // 读取湖的宽度
vector<int> h(n); // 存储地面高度的向量
for (int i = 0; i < n; i++) {
cin >> h[i]; // 读取地面的高度
}
stack<int> st; // 用于跟踪地面高度的栈
for (int i = 0; i < n; i++) {
if (st.empty() || abs(st.top() - h[i]) % 2 == 1) {
st.push(h[i]); // 如果栈为空或高度差是奇数,则将当前高度推入栈中
}
else if (abs(st.top() - h[i]) % 2 == 0) {
st.pop(); // 如果高度差是偶数,则弹出栈顶元素
}
}
if (st.size() > 1) {
cout << "NO" << endl; // 如果栈的大小大于 1,则无法填满湖
}
else {
cout << "YES" << endl; // 如果栈的大小为 1 或更小,则可以填满湖
}
}
return 0;
}