zoukankan      html  css  js  c++  java
  • 倒酒(扩展欧几里德)90分

    题目描述

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

    酒吧的生意并不好。Winy发现酒鬼们都非常穷。有时,他们会因为负担不起aml或者bml啤酒的消费,而不得不离去。因此,Winy决定出售第三种体积的啤酒(较小体积的啤酒)。

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

    为了简化倒酒的步骤,Winy规定:

    (1)a≥b;

    (2)酒桶容积无限大,酒桶中酒的体积也是无限大(但远小于桶的容积);

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

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

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

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

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

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

    输入输出格式

    输入格式:

    两个整数a和b(0<b≤a≤10^9)

    输出格式:

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

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

    若有多种可能的Pa、Pb满足要求,那么请输出Pa最小的一个。若在Pa最小的情况下,有多个Pb满足要求,请输出Pb最小的一个。

    输入输出样例

    输入样例#1: 复制
    5 3
    
    输出样例#1: 复制
    1
    1 2
    

    说明

    样例解释:倾倒的方案为:

    1、桶->B杯;2、B杯->A杯;

    3、桶->B杯;4、B杯->A杯;

    5、A杯->桶; 6、B杯->A杯;

    思路:

        最开始是发现最小是gcd(a, b);然后,觉得pa, pb其实就是ax+by=gcd(a, b)其实a的x为负数相当于倒掉的意思。b的y为正数相当于装满。又因为,求y的最小正值,肯定是先减为负数,然后再加为最小正数。

    #include<cstdio>
    using namespace std;
    #define ll long long
    void exgcd(ll a, ll b, ll &d, ll &x, ll &y)
    {
        if (b == 0){ d = a; x = 1; y = 0; }
        else { exgcd(b, a%b, d, y, x); y -= x*(a / b); }
    }
    
    int main(){
        ll a, b, d, x, y;
        scanf("%lld%lld", &a, &b);
        exgcd(a, b, d, x, y);
        while (y > 0){ x += b; y -= a; }
        while (y + a < 0){ x -= b; y += a; }
        x -= b; y += a;
        printf("%lld %lld
    ", -x, y);
    }
  • 相关阅读:
    黑马程序员——【Java基础】——Java IO流
    黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API
    黑马程序员——【Java基础】——集合框架
    nodeJs与elementUI实现上图片
    NodeJS连接mysql数据库
    nodeJs实现跨域
    将Express生成器下的pug修改为html
    git使用总结
    使用vue+elementUI组件实现表格自动完成
    nginx配置thinkphp5
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9985040.html
Copyright © 2011-2022 走看看