ZOJ-3593 One Person Game(擴充套件歐幾里得)
阿新 • • 發佈:2019-01-11
題意
座標軸上,一個人想從 點走到 點,每次移動可以向左或向右走 個單位、 個單位或 個單位,求最少移動多少次。
思路
先將原題轉化為向右移動 個單位需要的最小步數。如果不考慮長度為 的移動,不難看出,不可能向左移動 長度後,又向右移動 長度。那麼可以設向右的 移動作了 次(如果向左移動 為負),向右的 移動作了 次。所以這個移動的次數即為。用擴充套件歐幾里得求出 的特解後,寫出通解 , 。
當 和 同號時,結果為 ,當 和 異號時,結果為 ,我們可以考慮使 最小。
而
故當原式為零時
但原式不一定正好為零,所以在 這個範圍搜尋,找到最優解即可。
程式碼
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define Abs(x) ((x>0)?(x):-(x))
typedef long