Jams倒酒(pour)

Posted 【Lemon】

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jams倒酒(pour)相关的知识,希望对你有一定的参考价值。

1Jams倒酒(pour)

Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为a ml 和 b ml的酒杯来装载。

酒吧的生意并不好。Jams发现酒鬼们都很穷,不像他那么土豪。有时,他们会因为负担不起a ml 或者 b ml酒的消费,而不得不离去。因此,Jams决定出手第三种体积的啤酒(较小体积的啤酒)。

Jams只有两种杯子,容积分别为 a ml 和 b ml,而且啤酒杯是没有刻度的。他只能通过两种杯子和酒桶间的互相倾倒来得到新的体积的酒。

倒酒步骤为:

(1)            规定a>=b

(2)            酒桶容积无限,酒桶中酒体积无限大。

(3)            只能包含三种可能的倒酒操作:

1、 将酒桶中的酒倒入容积为b ml的酒杯中;

2、 将容积为a ml的酒杯中的酒倒入酒桶;

3、 将容积为b ml的酒杯中的酒倒入容积为 a ml的酒杯中。

(4)            每次倒酒必须把杯子倒满或者把被倾倒的杯子倒空。

Jams希望通过若干次倾倒得到容积为 a ml酒杯中剩下的就体积尽可能小,他请求你帮助他设计倾倒方案。

 

输入:

   两个整数a,b(0<b<=a<=10^9)

输出

   第一行一个整数,表示可以得到的最小体积的酒。

   第二行两个整数Pa和Pb(中间用一个空格分开),分别表示从体积为a ml的酒杯中到处酒的次数和将酒倒入体积为b ml的酒杯的次数。

   若有多种可能的Pa,Pb满足要求,那么请输出Pa最小的。若Pa最小的时候有多个Pb,那么输出Pb最小的。

样例输入

5 3

样例输出

1

1 2

 

倾倒方案为:

1、 桶->B;

2、 B->A;

3、 桶->B;

4、 B->A;

5、 A->桶;

6、 B->A;

 

对于20%的数据,pa,pb总和不超过5

对于60%的数据,pa<=10^8

对于100%的数据,0<b<=a<=10^9

 

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
int a,b;
int minn;
int xx,yy; 
int gcd(int x,int y)
{
    if(y==0) return x;
    else return gcd(y,x%y);
}
void exgcd(int x,int y)
{
    if(y==0) 
    {
        xx=1;
        yy=0;
        return ;
    }
    else
    {
        exgcd(y,x%y);
        int t=xx;
        xx=yy;
        yy=t-x/y*yy;
    }
}
int main()
{
    freopen("pour.in","r",stdin);
    freopen("pour.out","w",stdout);
    cin>>a>>b;
    minn=gcd(a,b);
    cout<<minn<<endl;
    a/=minn;b/=minn;
    exgcd(a,b);
    while(yy<0) yy+=a;
    xx=(1-yy*b)/a;
    cout<<-xx<<" "<<yy;
    fclose(stdin);fclose(stdout);
    return 0;
}

 

以上是关于Jams倒酒(pour)的主要内容,如果未能解决你的问题,请参考以下文章

Jams倒酒

洛谷——P1292 倒酒

P1292 倒酒

Do not pour out HDU - 5954 数学积分

洛谷 P1292 倒酒

Google Study Jams:带你入门 Android 开发