1、(25分)捡石头
【题目描述】
小强在河边捡了2块漂亮的石头,他想再捡两块石头,让这4块石头的质量正好为30斤,并且新捡的两块石头的质量是介于前两块石头的质量之间的数字,请编程输出第3块和第4块石头的质量。
注:每个石头的重量都是整数,如果找不到合适的石头,则输出0 0。
【输入格式】
输入2个数,数与数之间以空格间隔,表示2块石头的质量。
【输出格式】
输出表示第3、4块石头的质量的所有可能结果,每块石头质量的数字用空格隔开。多组结果时,按第3块石头质量从小到大排序分行输出。
【样例输入】
1 11
【样例输出】
8 10
9 9 

#include<iostream>
using namespace std;
int main() {
    // 用于存储前两块石头的质量
    int a, b;
    // 读取前两块石头的质量
    cin >> a >> b;
    // 如果a大于b,交换a和b的值,确保a小于等于b
    if (a > b) {
        swap(a, b); 
    }
    // 标记是否找到合适的石头组合,初始为false
    bool f = false;
    // 遍历可能的第三块石头的质量,范围是在a和b之间
    for (int c = a + 1; c <= b - 1; c++) { 
        // 计算第四块石头的质量,因为四块石头总质量为30斤
        int d = 30 - a - b - c;
        // 检查d是否也在a和b之间,并且c小于等于d(满足题目要求和避免重复输出)
        if (d >= a + 1 && d <= b - 1 && c <= d) {
            // 输出找到的第三块和第四块石头的质量
            cout << c << " " << d << endl;
            // 标记找到合适的石头组合
            f = true;
        }
    }
    // 如果没有找到合适的石头组合,输出0 0
    if (f == false) {
        cout << "0 0" << endl;
    }
    return 0;
}

2 条评论

  • @ 2025-5-31 20:18:50

    题目解析

    一、题目类型与核心考点

    本题属于编程中的逻辑算法题,核心考点在于根据给定的条件进行合理的算法设计与编程实现。主要涉及到整数运算、循环遍历以及条件判断等基础编程知识的综合运用。

    二、题目条件理解

    1. 已知条件
      • 初始有2块石头,通过输入获取这两块石头的质量,输入格式为两个以空格间隔的整数。
      • 目标是让4块石头(包括后续要找的2块)总质量恰好为30斤。
      • 新找的两块石头质量需介于前两块石头质量之间,且所有石头质量均为整数。
    2. 约束条件
      • 若不存在满足条件的石头质量组合,输出“0 0”。
      • 当存在多组满足条件的结果时,要按照第3块石头质量从小到大的顺序分行输出。

    三、解题思路分析

    1. 数据输入与预处理
      • 首先使用合适的输入函数(如在C++中用cin ,Python中用input函数配合数据类型转换)获取表示前两块石头质量的两个整数,并确保对输入数据的有效性进行初步检查(本题默认输入合法)。如果两个数的大小关系不确定,可通过条件判断和交换操作保证第一个数小于等于第二个数,方便后续处理。
    2. 寻找满足条件的石头质量组合
      • 利用循环结构来遍历可能的第三块石头质量。循环范围应从前两块石头中较小质量数加1开始,到较大质量数减1结束(因为新石头质量要介于前两者之间) 。
      • 在循环内部,根据4块石头总质量为30斤这一条件,通过计算得出第四块石头的质量(即30 - 前两块石头质量和 - 当前第三块石头质量 )。
      • 然后通过条件判断,检查计算出的第四块石头质量是否也介于前两块石头质量之间。如果满足条件,则找到一组符合要求的石头质量组合。
    3. 结果输出
      • 若在遍历过程中未找到任何满足条件的组合,按照要求输出“0 0”。
      • 若找到多组组合,需要将这些组合按照第3块石头质量从小到大的顺序进行排序(可以使用编程语言中自带的排序函数,如C++的std::sort ,Python的sorted函数等),然后分行输出每一组结果,每组结果中两个质量数用空格隔开。

    四、示例代码思路(以Python为例)

    # 获取前两块石头的质量
    a, b = map(int, input().split())
    if a > b:
        a, b = b, a
    results = []
    for c in range(a + 1, b):
        d = 30 - a - b - c
        if a < d < b and c <= d:
            results.append((c, d))
    if not results:
        print("0 0")
    else:
        results.sort()
        for r in results:
            print(r[0], r[1])
    
    1. 首先通过input().split()获取输入并使用map函数将其转换为整数,赋值给ab ,并调整顺序使a <= b
    2. 然后通过range(a + 1, b)循环遍历可能的第三块石头质量c ,计算出对应的第四块石头质量d ,判断d是否满足条件,若满足则将组合(c, d)添加到results列表中。
    3. 最后根据results列表是否为空决定输出“0 0”还是按序输出所有找到的组合。
    • @ 2025-5-31 20:17:58
      #include<iostream>
      using namespace std;
      int main() {
          // 用于存储前两块石头的质量
          int a, b;
          // 读取前两块石头的质量
          cin >> a >> b;
          // 如果a大于b,交换a和b的值,确保a小于等于b
          if (a > b) {
              swap(a, b); 
          }
          // 标记是否找到合适的石头组合,初始为false
          bool f = false;
          // 遍历可能的第三块石头的质量,范围是在a和b之间
          for (int c = a + 1; c <= b - 1; c++) { 
              // 计算第四块石头的质量,因为四块石头总质量为30斤
              int d = 30 - a - b - c;
              // 检查d是否也在a和b之间,并且c小于等于d(满足题目要求和避免重复输出)
              if (d >= a + 1 && d <= b - 1 && c <= d) {
                  // 输出找到的第三块和第四块石头的质量
                  cout << c << " " << d << endl;
                  // 标记找到合适的石头组合
                  f = true;
              }
          }
          // 如果没有找到合适的石头组合,输出0 0
          if (f == false) {
              cout << "0 0" << endl;
          }
          return 0;
      }
      

      代码总体说明

      这段代码的主要功能是根据题目要求,输入前两块石头的质量,然后找出满足条件的第三块和第四块石头的质量并输出。如果找不到满足条件的组合,就输出0 0

      主要步骤

      1. 输入与处理:读取前两块石头的质量ab,并确保a小于等于b
      2. 寻找组合:通过循环遍历第三块石头质量c的可能取值范围,计算出对应的第四块石头质量d,并检查d是否也在合适范围内,若满足条件则输出该组合并标记已找到。
      3. 输出结果:根据是否找到合适组合,输出相应结果。
      • 1