1. 程式人生 > >刷題感悟 - Guess Number Game II

刷題感悟 - Guess Number Game II

lob 部分 叠代 比較 public 權重 bsp win 相關

最近稍微有點懈怠了 刷題不勤了 勉勵下自己

這道題目挺有意思的

We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I‘ll tell you whether the number I picked is higher or lower.
However, when you guess a particular number x, and you guess wrong, you pay $x. You win the game when you guess the number I picked.

自己踩了兩下坑

坑1:首先沒有考慮到大數的權重 以為是最少次數為最優 因此將其作為簡單的二分查找來進行

錯誤代碼如下:

        // int sum=0;
        // int m = (int) (n)/2;
        // while(n-m>1){
        //     sum=sum+m;
        //     m=(int)(n+m)/2;
        // }
        // return sum;

簡單除暴的反了錯誤 。而後反思對代碼改進踩到了第二個坑

坑2:過於關註大數的權重,解決思路為:將n個數按照和分成幾乎相等的兩部分 然後取小數部分來進行不斷的疊加

問題所在 :無法證明小數部分最終結果一定會大於大數部分 。因此該思路部分結果錯誤

錯誤代碼如下:

  //     if(n==1)return 0;
    //     if(n==2)return 1;
    //     if(n==3)return 2;
    //  int m=selectm(n,1);
    //  int sum=m;
    //  while(n-m>0){
    //      if(n-m==1)m=selectm(m,1);
    //      else
    //      m=selectm(n,m);
    //      sum=sum+m;
    //  }
    
// return sum; // } // public int selectm(int n,int m){ // int sum = (n-m+1)*(n+m)/2; // int count=0; // for(;m<n;m++){ // count = count+m; // if(count*2>=sum){ // return m;} // } // return m;

經過反思查找相關質料後發現 其實這道題就是一個典型的Floyd算法 從1-2距離開始不斷的二分 選取值與原有的數據比較 得到較小值。

註意點:

1.傳入的值是n 數組的大小最好未n+1 X n+1

2.從什麽時候開始叠代 起始位置當從2-1開始 3-2,3-1,4-3,4-2,4-1,如此順序進行。

3.當兩個位置相鄰時 大小當為較小數。

代碼如下:

public int selectn(int n){
    int[][] p = new int[n+1][n+1];
    for(int i=2;i<n+1;i++){
        for(int j=i-1;j>0;j--){
            int globalmin=10000;
            for(int k=j+1;k<i;k++){
                int leftsum = (p[j][k-1]>p[k+1][i])?p[j][k-1]:p[k+1][i];
                int sum = k+leftsum;
                globalmin=(globalmin>sum)?sum:globalmin;
            }
            p[j][i]=(j+1==i)?j:globalmin;
        }
    }
    return p[1][n];

刷題感悟 - Guess Number Game II