FZU1081 等分液体

 Problem Description 题目链接

有三种容器R1,R2,R3,其容积分别是L,M,N。L,M,N 都是正整数且L=M+N。令R1 装满液体,试用最少的操作步骤 将 R1 中的液体均分。

 Input

第一行仅包含一个表示测试例个数的正整数n 。以下n 行为 n个测试例的输入数据。每个测试例仅有一行输入数据,含三个正整数L,M,N (1<=L,M,N<=150),两数间用一个空格隔开。

 Output

每个测试例都仅有一行输出,若有解,输出操作的次数,若无解则输出“no”。

 Sample Input

3 100 70 30 90 60 30 80 45 35

 Sample Output

9 no 15
 
#include <iostream>
using namespace std;

/*
    思路:求出r1/2与r2、r1/2与r3、r2与r3的最大公约数
        1.如果r1/2与r2的最大公约数不等于r2与r3的最大公约数 或者r1/2与r3的最大公约数不等于r2与r3的公约数,说明倒液体的过程中无法凑出需要的等分液体
        2.根据规律可看出,如果公约数相等,那么r1/(r2与r3的最大公约数)-1就是倒液体的次数  
*/

//最大公约数
int gcd(int x, int y)
{
    if (x % y == 0)
        return y;
    return gcd(y, x % y);
}

int main()
{
    int n, r1, r2, r3;

    cin >> n;
    while (n--)
    {
        cin >> r1 >> r2 >> r3;
        int r2r3gcd = r2 > r3 ? gcd(r2, r3) : gcd(r3, r2);
        int r1r2gcd = r1 / 2 > r2 ? gcd(r1 / 2, r2) : gcd(r2, r1 / 2);
        int r1r3gcd = r1 / 2 > r3 ? gcd(r1 / 2, r3) : gcd(r3, r1 / 2);

        if (r1r2gcd != r2r3gcd || r1r3gcd != r2r3gcd)
            cout << "no" << endl;
        else
        {
            cout << (r1 / r2r3gcd - 1) << endl;
        }
    }
}
原文地址:https://www.cnblogs.com/dlvguo/p/12686063.html