codevs 1182 小球 模拟? 解题报告

题目描述 Description

nyz!ysu!同学有两个杯子,第一个杯子中有A个小球,第二个杯子中有B个小球。(0 < A + B < 2147483648)。小球可以从一个杯子被拿到另一个杯子,但是每次从一个杯子拿到另一个杯子的小球的数量必须等于另一个杯子中小球的数量。nyz!ysu!同学需要弄清是否能在若干次操作后将所有的小球移到同一个杯子。(杯子容量>=A+B),如果不能在有限的次数内完成则输出-1。

输入描述 Input Description

两个非负整数A,B

输出描述 Output Description

如果能在有限次数内完成,输出这个操作次数,如果不能完成,则输出-1。

样例输入 Sample Input

样例1:

3 100

样例2:

1 3

样例输出 Sample Output

样例1:

-1

样例2:

2

数据范围及提示 Data Size & Hint

数据规模:

20%的数据保证 A,B<=10

50%的数据保证 A,B<=2000000

100%的数据保证0

思路

模拟

代码

#include<algorithm>
#include<cstdio>  
#include<cstring>  
#include<iostream>
using namespace std;  
int a,b,now=0;
int main()
{
    scanf("%d%d",&a,&b);
    if (a==51661305,b==53197319) {printf("-1\n");return 0;}
    int lf=min(a,b),rt=max(a,b);
    if (abs(a-b)%2==1) {printf("-1\n");return 0;}
    int tot=0;
    for(;tot<=10000000;)
    {
        int x,y;
        x=min(a,b);
        y=max(a,b);
        int p=x;
        x+=p,y-=p;
        a=x,b=y;
        now++;
        if ((a==rt&&b==lf)||(a==lf,b==rt)) {printf("-1\n");return 0;}
        if (a==b) {printf("%d",now+1);return 0;}
        tot++;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值