Boxes

题目大意:有两个箱子,一个箱子装了A个球,一个箱子装了B个球,可以从球多的那个箱子拿出来球少的箱子里面球的总数放在少的那个箱子里面,问能否把球全部放在一个箱子里面?

分析:很容易求出来最后放的拿一下一定是A == B,再继续往前推A/=2....所以判断拿球的过程中是否有2^k次方数,如果有就能放,没有肯定不能放,特殊的AB开始有为0的,直接模拟也可以,注意两个箱子大小交替不会超过两次,如果超过,一定不能交换成功,因为如果能摆放成功的话,最多交换一次。

代码如下:

=======================================================================================================================

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<set>
using namespace std;

int main()
{
    int A, B, cnt=0, ok=0, k=0;

    scanf("%d%d", &A, &B);

    set<int> s;

    if(A > B)
        swap(A, B);

    while(1)
    {
        if(A > B)
        {
            swap(A, B);
            k++;
        }

        if(A == 0)
            break;

        if(s.find(A) != s.end() || k==2)
        {
            ok = 1;
            break;
        }
        else
            s.insert(A);
        cnt++;

        B -= A, A += A;
    }

    if(ok)
        printf("-1
");
    else
        printf("%d
", cnt);

    return 0;
}
原文地址:https://www.cnblogs.com/liuxin13/p/4836309.html