zoukankan      html  css  js  c++  java
  • 一步之遥【扩展欧几里得】

    从昏迷中醒来,小明发现自己被关在X星球的废矿车里。
    矿车停在平直的废弃的轨道上。
    他的面前是两个按钮,分别写着“F”和“B”。

    小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。
    按F,会前进97米。按B会后退127米。
    透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。
    他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
    或许,通过多次操作F和B可以办到。

    矿车上的动力已经不太足,黄色的警示灯在默默闪烁...
    每次进行 F 或 B 操作都会消耗一定的能量。
    小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。

    请填写为了达成目标,最少需要操作的次数。

    /*
      解不定方程
      97x + 127y = 1
      
      欧几里得定理 ---- 辗转相除法  gcd
      扩展欧几里得定理
      Ax + By = gcd(A,B)
      理论基础: gcd(A,B) == gcd(B,A%B)
      
      求出特解后,通解很好表示
      
      Ax + By = gcd(A, B)
      Ax + By = gcd(B, A%B)
      B * (A / B * x + y) + (A % B) * x = gcd(B, A%B)
      对比:
      A / B * x + y = 新x
      x = 新y
    */
    
    public class Main {
        // 返回最大公约数
        // xy: 顺便解出的xy
        static int e_gcd(int A, int B, int[] xy) {
            if (B == 0) {
                xy[0] = 1;
                xy[1] = 0;
                return A;
            }
    
            int ans = e_gcd(B, A % B, xy);
            int t = xy[0];
            xy[0] = xy[1];
            xy[1] = t - A / B * xy[0];
            return ans;
        }
    
        public static void main(String[] args) {
            int[] xy = new int[2];
            int a = e_gcd(97, 127, xy);
    
            System.out.println(a);
            System.out.println(xy[0] + " " + xy[1]);
        }
    }
  • 相关阅读:
    动态规划-1维消消乐
    矩阵求幂-倍加算法
    动态规划-匹配问题
    动态规划-最短回文串
    动态规划-最长回文子串
    动态规划-矩形嵌套
    动态规划-硬币找零
    windows 2003最完善最完美的权限及安全设置解决方案【转】
    python模块之email: 电子邮件编码
    word页面设置问题。通过域设置首页不计算页面的自定义页码格式
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8596117.html
Copyright © 2011-2022 走看看