18. 填坑Ⅰ

目录

题目

思路

注意事项 

C++完整代码(含详细注释)


题目

Description
又是北湖深坑,惊不惊喜,意不意外?!
 觉得用水填湖太没意思了,用石头填坑多有意思。
假设北湖的地面还是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。
现提供不限量的  规格的石头,问是否可以将北湖填平。(所有地面到达同一高度即为填平)
注:石头只能水平或垂直填放。
Input
样例有多组输入至文件末尾;
每组用例占两行;
第一行输入1个整数  表示北湖地面总宽度;
第二行输入  个整数  ,用空格间隔,表示地面高度。
Output
若能填平则输出“YES”,否则输出“NO”。

测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 5↵
  2. 2 1 1 2 5↵
  3. 3↵
  4. 4 5 3↵
  5. 3↵
  6. 1 2 3↵
以文本方式显示
  1. YES↵
  2. YES↵
  3. NO↵
1秒 64M 0


思路

  1. 初始化一个空栈和一个向量来存储地面的高度。
  2. 对于输入数组中的每个元素,执行以下操作:
    a. 如果栈为空或栈顶元素与当前高度的绝对差是奇数,则将当前高度推入栈中。
    b. 如果栈顶元素与当前高度的绝对差是偶数,则弹出栈顶元素。
  3. 处理完所有元素后,如果栈的大小大于1,则输出"NO"(表示无法填满湖),否则输出"YES"(表示可以填满湖)。

注意事项 

  • 代码使用栈来跟踪地面的高度,因为当一个石头水平放置时,它填充了相邻的两个地面元素,所以高度差必须是偶数。当一个石头垂直放置时,它只填充了一个地面元素,所以高度差必须是奇数。
  • 代码使用取模运算符(%)来检查高度差是偶数还是奇数。
  • 代码使用abs()函数来计算两个高度之间的绝对差。

C++完整代码(含详细注释)

#include 
#include 
#include 
#include  // 使用 abs() 函数

using namespace std;

int main() {
	int t;
	cin >> t; // 读取测试用例的数量

	while (t--) { // 遍历每个测试用例
		int n;
		cin >> n; // 读取湖的宽度

		vector h(n); // 存储地面高度的向量
		for (int i = 0; i < n; i++) {
			cin >> h[i]; // 读取地面的高度
		}

		stack 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;
}

你可能感兴趣的:(程序设计方法与实践,算法,c++,数据结构)