倒水问题--英雄会

先看看题目:

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。

可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。     问是否能够通过有限次操作,使得水缸最后恰好有C升水。

输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。

 

看到这一题,想到曾经做的一个题目,具体忘记了,说得大概是只猴子(具体忘了,不影响题意)要去一个目标距离为c的地点,可以选择一般的跳,和超级跳两个距离分别是a、b,当然,可以选择向前或向后跳。

当时的思路就是直接将a,b辗转相除得到最大公约数,然后再将c取余最大公约数,为0的话就可以到达目的,否则不可;

不过今天我忘记了为什么会是这样额,于是参考了一下别人的意见(http://www.th7.cn/Program/c/201309/148378.shtml)希望作者不要怪我啊...

这是我自己的想法:

我们已知我们有A,B升的两个容器,假设A > B,那么每次可以倒的水的量为A , B ,( A - B)升水,设置3个因子,分别为x1 ,  x2,  x3,如果可以使得水缸最后恰好有C升水,那么必然存在整数x1 , x2, x3,使得Ax1 + Bx2, +  (A - B)x3  = C  等式成立;

即(x1 + x)A + (x2- x)B = C ;

实际上xA + yB = C即可(其中涉及到的参数即为整数);

假设A,B的公约数是K,那么xA + yB = nK = C;

所以将C取余K即可;

好了,思想就到这了,贴出代码:

#include <stdio.h>
#include <stdlib.h>

int HighestCommon(int m, int n)
{
    int temp;
    while(m)
    {
        temp = m;
        m = n % m;
        n = temp;
    }
    return n;
}


int can(int a, int b, int c)
{

    int temp;
    temp = HighestCommon(a, b);

    if(c % temp == 0)
        return 1;
    else
        return 0;
}

//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
    printf("%d", can(5, 2, 9));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

 

如果不理解的大家继续讨论...

 

欢迎大牛指点...o(∩_∩)o

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值