吃水果【贪心+数学】

题意:

题目链接

分析:

(n=m) 时,显然只能通过不断的吃水果来达到目标,因此使两种水果的数量相等就是我们的目的。
(n<m)
注意到 (ngeq lceilfrac{m}{2} ceil)(n<m) 时,可以同时减小两个的值来使得 (n) 的值等于二者的差值,这样只要再对 (n) 进行 (*2) 的操作,二者即可相等。
(n<lceilfrac{m}{2} ceil) 时,可以通过对 (n) 进行 (*2) 来达到第一个条件。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        if(n>m)
            swap(n,m);
        int cnt=0;
        while(n!=m)
        {
            if(n>=(m+1)/2&&n<m)
            {
                int d=m-n;
                cnt+=(n-d);
                cnt++;
                n=2*d;
                m=2*d;
            }
            else
            {
                n*=2;
                cnt++;
            }
        }
        cnt+=n;
        printf("%d
",cnt);
    }
    return 0;
}

也可以直接计算出结果:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        if(n>m)
            swap(n,m);
        int cnt=m+1;
        int d=(log(1.0*m/n)/log(2.0));
        if(m!=2*n)
            cnt+=d;
        printf("%d
",cnt);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/12682124.html