题解:洛谷 P5710 数的性质
【题目来源】
【题目描述】
一些整数可能拥有以下的性质:
- 性质 1:是偶数;
- 性质 2:大于 \(4\) 且不大于 \(12\)。
小 A 喜欢这两个性质同时成立的整数;Uim 喜欢这至少符合其中一种性质的整数;八尾勇喜欢刚好有符合其中一个性质的整数;正妹喜欢不符合这两个性质的整数。现在给出一个整数 \(x\),请问他们是否喜欢这个整数?
【输入】
输入一个整数 \(x(0\le x\le 1000)\)
【输出】
输出这 \(4\) 个人是否喜欢这个数字,如果喜欢则输出 1,否则输出 0,用空格分隔。输出顺序为:小 A、Uim、八尾勇、正妹。
【输入样例】
12
【输出样例】
1 1 0 0
【核心思想】
-
问题分析:给定整数 \(x\),判断其是否满足两个性质:性质 1(偶数)、性质 2(大于 4 且不大于 12)。根据四个人的喜好定义输出四个布尔值:
- 小 A:两个性质同时成立(\(b1 \land b2\))
- Uim:至少符合一种(\(b1 \lor b2\))
- 八尾勇:刚好符合一个(\(b1 \oplus b2\),异或)
- 正妹:两个都不符合(\(\neg b1 \land \neg b2\))
-
算法选择:
- 布尔条件分解:先计算两个基础布尔条件,再根据逻辑组合判断四个人的喜好
- 分类讨论:根据 \(b1\) 和 \(b2\) 的真假组合分为三种情况,每种情况对应固定的输出模式
-
关键步骤:
- 读入数据:
cin >> x - 计算基础条件:
b1 = (x % 2 == 0):是否为偶数b2 = (x > 4 && x <= 12):是否在 \((4, 12]\) 范围内
- 分类输出:
- 若
b1 && b2:输出1 1 0 0(小 A 喜欢,Uim 喜欢,八尾勇不喜欢,正妹不喜欢) - 否则若
b1 || b2:输出0 1 1 0(小 A 不喜欢,Uim 喜欢,八尾勇喜欢,正妹不喜欢) - 否则:输出
0 0 0 1(只有正妹喜欢)
- 若
- 三种情况互斥且完备,覆盖所有 \(2^2=4\) 种布尔组合
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),常数次判断和输出
- 空间复杂度:\(O(1)\),仅需两个布尔变量
-
布尔逻辑的核心思想:
- 条件分解:将复合判断拆分为基础布尔条件,降低复杂度
- 真值表完备性:\(b1\) 和 \(b2\) 共有四种组合,但输出模式只有三种(\(b1 \land b2\) 和 \(\neg b1 \land \neg b2\) 各一种,其余两种合并为"刚好一个")
- 短路优化:
if-else if链利用短路特性,一旦匹配即退出 - 适用于布尔逻辑、条件判断、分类讨论类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int x; // 定义输入变量x
cin >> x; // 输入整数x
// 定义两个布尔条件:
bool b1 = (x % 2 == 0); // 条件1:x是偶数
bool b2 = (x <= 12 && x > 4); // 条件2:x在5到12之间(包含12)
// 方法一(注释掉的原始方案):分别输出四个判断结果
// if(b1&&b2) cout << "1 ";
// else cout << "0 ";
// if(b1||b2) cout << "1 ";
// else cout << "0 ";
// if((b1&&!b2)||(!b1&&b2)) cout << "1 ";
// else cout << "0 ";
// if(!b1&&!b2) cout << "1 ";
// else cout << "0 ";
// 方法二(实际采用的方案):合并输出四个判断结果
if (b1 && b2) // 情况1:同时满足两个条件
{
cout << "1 1 0 0"; // 输出:满足条件1和2,不满足其他
}
else if (b1 || b2) // 情况2:满足至少一个条件
{
cout << "0 1 1 0"; // 输出:不满足同时满足,但满足至少一个
}
else // 情况3:两个条件都不满足
{
cout << "0 0 0 1"; // 输出:只满足都不满足的情况
}
return 0; // 程序正常结束
}
【运行结果】
12
1 1 0 0
浙公网安备 33010602011771号