1 条题解

  • 0
    @ 2025-4-8 14:40:37

    解题思路: 本题可通过逆向思维,从给定的节点(i,j) 反向推导到根节点 (1, 1)。在反向推导过程中,如果 (i > j),说明最后一步是从左子节点到达当前节点,反之则是从右子节点到达。不断进行反向推导,同时记录向左和向右走的次数。

    实现步骤

    1. 读取测试用例的数量。
    2. 对于每个测试用例:读取节点的坐标(i, j)。初始化向左和向右走的次数为 0,当(i, j)不等于(1, 1)时,进行逆向推导: 如果 i > j,则i减去j,并增加向左走的次数;如果i < j,则j减去i,并增加向右走的次数。 代码:
    #include <iostream>
    using namespace std;
    
    int main() {
        int scenarios;
        cin >> scenarios;
    
        for (int i = 1; i <= scenarios; ++i) {
            int leftCount = 0, rightCount = 0;
            int a, b;
            cin >> a >> b;
    
            while (a != 1 || b != 1) {
                if (a > b) {
                    int steps = (a - 1) / b;
                    leftCount += steps;
                    a -= steps * b;
                } else {
                    int steps = (b - 1) / a;
                    rightCount += steps;
                    b -= steps * a;
                }
            }
    
            cout << "Scenario #" << i << ":" << endl;
            cout << leftCount << " " << rightCount << endl;
            cout << endl;
        }
    
        return 0;
    }    
    
    
    • 1

    信息

    ID
    1500
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者