题解:洛谷 P5710 数的性质

【题目来源】

洛谷:P5710 【深基3.例2】数的性质 - 洛谷

【题目描述】

一些整数可能拥有以下的性质:

  • 性质 1:是偶数;
  • 性质 2:大于 \(4\) 且不大于 \(12\)

小 A 喜欢这两个性质同时成立的整数;Uim 喜欢这至少符合其中一种性质的整数;八尾勇喜欢刚好有符合其中一个性质的整数;正妹喜欢不符合这两个性质的整数。现在给出一个整数 \(x\),请问他们是否喜欢这个整数?

【输入】

输入一个整数 \(x(0\le x\le 1000)\)

【输出】

输出这 \(4\) 个人是否喜欢这个数字,如果喜欢则输出 1,否则输出 0,用空格分隔。输出顺序为:小 A、Uim、八尾勇、正妹。

【输入样例】

12

【输出样例】

1 1 0 0

【核心思想】

  1. 问题分析:给定整数 \(x\),判断其是否满足两个性质:性质 1(偶数)、性质 2(大于 4 且不大于 12)。根据四个人的喜好定义输出四个布尔值:

    • 小 A:两个性质同时成立\(b1 \land b2\)
    • Uim:至少符合一种\(b1 \lor b2\)
    • 八尾勇:刚好符合一个\(b1 \oplus b2\),异或)
    • 正妹:两个都不符合\(\neg b1 \land \neg b2\)
  2. 算法选择

    • 布尔条件分解:先计算两个基础布尔条件,再根据逻辑组合判断四个人的喜好
    • 分类讨论:根据 \(b1\)\(b2\) 的真假组合分为三种情况,每种情况对应固定的输出模式
  3. 关键步骤

    • 读入数据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\) 种布尔组合
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),常数次判断和输出
    • 空间复杂度:\(O(1)\),仅需两个布尔变量
  5. 布尔逻辑的核心思想

    • 条件分解:将复合判断拆分为基础布尔条件,降低复杂度
    • 真值表完备性\(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
posted @ 2026-08-05 15:46  团爸讲算法  阅读(25)  评论(0)    收藏  举报