【牛客】網易2016筆試題:飢餓的小易

鏈接:https://www.nowcoder.com/questionTerminal/5ee8df898312465a95553d82ad8898c3
來源:牛客網
 

小易總是感覺飢餓,所以作爲章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能通過神祕的力量移動到 4 * x + 3或者8 * x + 7。因爲使用神祕力量要耗費太多體力,所以它只能使用神祕力量最多100,000次。貝殼總生長在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你幫忙計算最少需要使用多少次神祕力量就能吃到貝殼。

 

輸入描述:

輸入一個初始位置x_0,範圍在1到1,000,000,006


 

輸出描述:

輸出小易最少需要使用神祕力量的次數,如果使用次數使用完還沒找到貝殼,則輸出-1

示例1

輸入

125000000

輸出

1

解題思路:

/**思路:
     * 小易的移動方程
     * f(x) = 4 * x + 3;
     * g(x) = 8 * x + 7;
     *
     * 計算可以得出規律:
     * 1.g(f(x)) = f(g(x))
     * 2.f(f(f(x))) = g(g(x)) 也就是三次f(x) = 兩次g(x)
     *
     * 有規律1 所以可以存在:ffggfggff = fffffgggg
     * 有規律2 所以可以存在:fffffgggg = ffgggggg
     *
     * 可以得出一個最有策略:f的執行次數爲0,1,2。-> x,4*x + 3,4(4*x+3) + 3
     * 在f的執行基礎上求最小g的執行次數

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long num = sc.nextLong();
        long m = 1000000007;
        long mystery = 100000;
        long [] begin = new long[3];
        begin[0] = num;
        begin[1] = 4*begin[0]+3;
        begin[2] = 4*begin[1]+3;
        long step = 0;
        long minStep = mystery;
        long cur = 0;
        for(int i = 0;i<3;i++){
            step = i;
            cur = begin[i];
            while (cur!=0 && step<minStep ){//條件二:如果算出比當前更長的step就不需要算下去了
                cur = (8*cur+7)%m;
                step++;
            }
            if(step<minStep)
                minStep = step;
        }
        if(minStep<mystery)
            System.out.println(minStep);
        else
            System.out.println(-1);
    }
}


    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章