京東2016實習生研發工程師編程題

年終獎


小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放着36個價值不等的禮物,每個小的棋盤上面放置着一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裏的禮物小東都能拿到,請設計一個算法使小東拿到價值最高的禮物。
給定一個6*6的矩陣board,其中每個元素爲對應格子的禮物價值,左上角爲[0,0],請返回能獲得的最大價值,保證每個禮物價值大於100小於1000。


之前用的回溯,找出每一條路徑,然後寫出最大。後來看了標籤發現這個很典型的DP啊。實力不足。無法一眼看出,還是我被棋盤題影響了。


class Bonus {
public:
    int getMost(vector<vector<int> > board) {
        // write code here
        int dp[7][7]{};
        for(int j=0;j<6;++j){
            for(int i=0;i<6;++i){
                dp[j+1][i+1]=max(dp[j][i+1],dp[j+1][i])+board[j][i];
            }
        }
        return dp[6][6];
    }
};

拋小球


小東和三個朋友一起在樓上拋小球,他們站在樓房的不同層,假設小東站的樓層距離地面N米,球從他手裏自由落下,每次落地後反跳回上次下落高度的一半,並以此類推知道全部落到地面不跳,求4個小球一共經過了多少米?(數字都爲整數)
給定四個整數A,B,C,D,請返回所求結果。
測試樣例:
100,90,80,70
返回:1020


這個主要就是要加上下落距離一半後再遞歸。然後注意用小數計算,最後要向上取整,因爲我們在趨近於處進行了取捨。


class Balls {
public:
    int calcDistance(int A, int B, int C, int D) {
        // write code here
        if(!(A||B||C||D))   return 0;
        //由於是忽略最後一部分,所以要直接向上取整
        return getDis(A,B,C,D)+0.5;
    }
private:
    double getDis(double A,double B,double C,double D){
        if(A<1E-6&&B<1E-6&&C<1E-6&&D<1E-6)  return 0;
        double sum=A+B+C+D+(A/=2)+(B/=2)+(C/=2)+(D/=2);
        return sum+getDis(A,B,C,D);
    }
};

小東分蘋果


果園裏有一堆蘋果,一共n頭(n大於1小於9)熊來分,第一頭爲小東,它把蘋果均分n份後,多出了一個,它扔掉了這一個,拿走了自己的一份蘋果,接着第二頭熊重複這一過程,即先均分n份,扔掉一個然後拿走一份,以此類推直到最後一頭熊都是這樣(最後一頭熊扔掉後可以拿走0個,也算是n份均分)。問最初這堆蘋果最少有多少個。
給定一個整數n,表示熊的個數,返回最初的蘋果數。保證有解。
測試樣例:
2
返回:3


注意前後關係,pre/(n-1)*n+1=next。根據next能否在結束前面除盡n-1進行淘汰。


class Apples {
public:
    int getInitial(int n) {
        // write code here
        for(int i=0;;++i){
            int j=1,pre,next;
            for(pre=i;j<n;++j){
                pre=pre/(n-1)*n+1;
                if(pre%(n-1)||pre<n-1)   break;
            }
            if(j==n)    return pre/(n-1)*n+1;
        }
        return 0;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章