题解:洛谷 AT_abc466_a Compromise
【题目来源】
洛谷:AT_abc466_a [ABC466A] Compromise
【题目描述】
There are \(N\) choices.
You will choose one of these choices. If you choose the \(i\)-th choice, your happiness will be \(X_i\).
If your happiness will be negative no matter which choice you choose, output Yes; otherwise, output No.
有 \(N\) 个选项。
你将选择其中一个选项。如果你选择第 \(i\) 个选项,你的幸福值将为 \(X_i\)。
如果你无论选择哪个选项幸福值都会变为负数,输出 Yes;否则,输出 No。
【输入】
The input is given from Standard Input in the following format:
\(N\)
\(X_1\) \(X_2\) \(\ldots\) \(X_N\)
【输出】
Output Yes or No according to the instructions in the problem statement.
【输入样例】
4
2 0 -1 2
【输出样例】
No
【核心思想】
-
问题分析:给定 \(N\) 个选项,每个选项对应一个幸福值 \(X_i\)。需要判断是否无论选择哪个选项,幸福值都为负数(即所有 \(X_i < 0\))。这是一个线性扫描判定问题,核心在于检查数组中是否存在非负元素。
-
算法选择:
- 遍历判定:线性扫描数组,一旦发现 \(X_i \geq 0\) 即可提前终止并输出结果
-
关键步骤:
- 读入数据:读取 \(N\) 和数组 \(X[1..N]\)
- 遍历检查(\(i\) 从 \(1\) 到 \(N\)):
- 若 \(X_i \geq 0\):输出
No并结束程序
- 若 \(X_i \geq 0\):输出
- 输出结果:若遍历完所有元素均未发现非负数,输出
Yes
-
时间/空间复杂度:
- 时间复杂度:\(O(N)\),最坏情况遍历全部 \(N\) 个元素
- 空间复杂度:\(O(1)\),仅需常数额外空间(或 \(O(N)\) 存储输入数组)
-
线性扫描与提前终止的核心思想:
- 存在性判定:问题转化为"是否存在 \(X_i \geq 0\)",这是一个存在量词判定问题,一旦发现满足条件的元素即可确定答案
- 提前终止优化:找到第一个非负元素后立即输出
No并退出,避免不必要的后续遍历,最坏情况为全负数时才需完整扫描 - 边界值处理:\(X_i = 0\) 时幸福值不为负,应输出
No,因此判断条件为 \(X_i \geq 0\) 而非 \(X_i > 0\) - 逻辑对偶:"所有选项都使幸福值为负"等价于"不存在任何选项使幸福值 \(\geq 0\)",利用这一等价转换简化判定逻辑
- 适用于简单条件判定、存在性检查类基础问题
【算法标签】
模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 15; // 常量:最大选项数量
int n; // n: 选项数量
int a[N]; // a[i]: 选择第 i 个选项获得的幸福值
int main()
{
cin >> n; // 读入选项数量
for (int i = 1; i <= n; i++) // 读入每个选项的幸福值
cin >> a[i];
for (int i = 1; i <= n; i++) // 遍历所有选项
if (a[i] >= 0) // 如果存在一个选项的幸福值非负
{
cout << "No" << endl; // 存在不会变负的选择,输出 No
return 0;
}
cout << "Yes" << endl; // 所有选项的幸福值都为负,输出 Yes
return 0;
}
【运行结果】
4
2 0 -1 2
No
浙公网安备 33010602011771号