一步之遥

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

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

请问为了达成目标,最少需要操作的次数是多少。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

------------------------------------------------------------------------------------------------------------------

分析

由贝祖定理可知给予二个整数a、b,必存在整数x、y使得ax + by = gcd(a,b) ,且存在x < b, y < a满足等式。因为gcd(97, 127) = 1,所以可以断定小明可以把0变成1,并且步数在97 + 127步之内。只需要设计一个O(n^2)复杂度的算法即可满足需求。

解法

枚举操作1和操作2的次数,若结果刚好为1,记录为可能答案,在所有可能答案中选一个最小值即可。

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int ans = 600;//答案必然在600以内
 7     for (int i = 0; i <= 300; i++) {//枚举操作1
 8         for (int j = 0; j <= 300; j++) {//枚举操作2
 9             if (i * 97 - j * 127 == 1) ans = min(ans, i + j);//求最小答案
10         }
11     }
12     printf("%d\n", ans);
13     return 0;
14 }

 

提高

扩展欧几里得算法可以快速求得x和y的值。时间复杂度O log(min(a,b))    详见连接 https://blog.csdn.net/destiny1507/article/details/81750874

 

----------------后续有新加入,新的体会与理解再更新……

posted @ 2022-03-03 19:22  闫佳杰  阅读(98)  评论(0)    收藏  举报