拼多多筆試題(一):多多的魔術盒子

過往很淡江邊草發表於2020-09-24

問題描述:

 多多雞有N個魔術盒子(編號1~N),其中編號為i的盒子裡有i個球。
多多雞讓皮皮蝦每次選擇一個數字X(1 <= X <= N),多多雞就會把球數量大於等於X個的盒子裡的球減少X個。
通過觀察,皮皮蝦已經掌握了其中的奧祕,並且發現只要通過一定的操作順序,可以用最少的次數將所有盒子裡的球變沒。

那麼請問聰明的你,是否已經知道了應該如何操作呢?

輸入描述:

第一行,有1個整數T,表示測試用例的組數。
(1 <= T <= 100)
接下來T行,每行1個整數N,表示有N個魔術盒子。
(1 <= N <= 1,000,000,000)

輸出描述:

共T行,每行1個整數,表示要將所有盒子的球變沒,最少需要進行多少次操作。

輸入用例:

3
1
2
5

輸出用例:

1
2
3

思路分析:

首先想到的就是通過二分法來解決,每次取中間的數,後面的數字一次減x,再次尋找陣列起始點與中間數的中間值,直到陣列中間值等於a[0],就相當於求二分法的時間複雜度log(n)底數為2。然後通過分析,如果是2的整數倍,那麼a[n]還需要一步操作,如果不是2的整數倍也需要對a[0]進行減1操作。所以就是求 log(n)+1。看到有人通過求二進位制的長度解決這道題,道理一樣,求二級制也是不斷除以2,其長度就是除以2的次數加1

程式碼實現:

import java.util.Scanner;

public class MagicTool {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] a = new int[N];
        for(int i=0;i< a.length;i++){
            a[i]=scanner.nextInt();
            a[i]= (int) (Math.log(a[i])/Math.log(2))+1;
        }
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }

相關文章