codevs 1182 小球 模拟? 解题报告

来源:互联网 发布:软件著作好处 编辑:程序博客网 时间:2024/06/07 19:36

题目描述 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;}
原创粉丝点击