1. 程式人生 > >PAT1088 三人行 (20 分)

PAT1088 三人行 (20 分)

思路:

           設甲的能力值為a * 10 + b, 那麼已是b *  10 + a。如果乙的能力強於甲,那麼根據題意可得出:((b * 10 + a) -( a  * 10 + b)) / x = (b * 10 + a) / y,所以,(9 * y - 10 * x) * b = (x + 9 * y) * a。因為乙的能力大於甲,所以0<a<=b<10。如果甲的能力強於乙,那麼((a * 10 + b) - (b * 10 + a)) / x = (b * 10) / y,那麼,(9 * y - x) * a = (10 * x + 9 * y) * b。因為甲的能力大於乙的能力,所以0<=b<=a<10 (a != 0)。因為甲以甲的最大解為標準,所以乙的能力大於甲放在前面,並且注意將a * 10 + b以遞增的形式遍歷。

坑點:

  • 甲的最大值為標準
  • 甲的能力值必須為兩位,但是乙的能力值不一定為兩位,也可以為一位
  • 甲乙的能力值為整數,但丙的能力值為double型別
#include <iostream>

using namespace std;

void out(int a1, int b1)
{
    if(a1 > b1)
        cout<<"Cong ";
    else if(a1 < b1)
        cout<<"Gai ";
    else
        cout<<"Ping ";
}

void solve()
{
    int m, x, y;
    cin>>m>>x>>y;
    int r1 = x + 9 * y, r2 = 9 * y - 10 * x;
    int a = -1, b = -1;
    for(int i = 1; i < 10; i++)
        for(int j = i; j < 10; j++)
        {
            if(r1 * i == r2 * j)
            {
                a = i * 10 + j;
                b = j * 10 + i;
            }
        }
    r1 = 9 * y - x;
    r2 = 10 * x + 9 * y;
    for(int i = 1; i < 10; i++)
        for(int j = 0; j <= i; j++)
        {
            if(r1 * i == r2 * j)
            {
                a = i * 10 + j;
                b = j * 10 + i;
            }
        }
    if(a == -1)
    {
        cout<<"No Solution"<<endl;
        return;
    }
    cout<<a<<" ";
    double c = b* 1.0 / y;
    out(a, m);
    out(b, m);
    double d = m;
    if(c > d)
        cout<<"Cong";
    else if(c < d)
        cout<<"Gai";
    else
        cout<<"Ping";
    cout<<endl;
    return;
}

int main()
{
    solve();
    return 0;
}

                                                                                                                                      20分一般類,易想但要注意細節,不然容易掉坑       

                                                                                                                                                                               2018年9月19日 9:26:39