程式設計測試題 阿里巴巴2023年提前批程式設計題

2021-08-22 13:30:26 字數 2110 閱讀 4630

光明小學的小朋友們要舉行一年一度的接力跑大賽了,但是小朋友們卻遇到了乙個難題:設計接力跑大賽的線路,你能幫助他們完成這項工作麼? 

光明小學可以抽象成一張有n個節點的圖,每兩點間都有一條道路相連。光明小學的每個班都有m個學生,所以你要為他們設計出一條恰好經過m條邊的路徑。 

光明小學的小朋友們希望全盤考慮所有的因素,所以你需要把任意兩點間經過m條邊的最短路徑的距離輸出出來以供參考。*

你需要設計這樣乙個函式: 

res solve( n, m, map); 

注意:map必然是n * n的二維陣列,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路全部是無向邊,無自環)2 <= n <= 100, 2 <= m <= 1e6。要求時間複雜度控制在o(n^3*log(m))。 

map陣列表示了一張稠密圖,其中任意兩個不同節點i,j間都有一條邊,邊的長度為map[i][j]。n表示其中的節點數。 

你要返回的陣列也必然是乙個n * n的二維陣列,表示從i出發走到j,經過m條邊的最短路徑 

你的路徑中應考慮包含重複邊的情況。 

這個題目要求在30分鐘內解決,臣妾做不到的說。先來看看題目解析。 

題目解析:該題目要求在m次選擇中,計算出i與j之間距離最短的值,是一種動態規劃題型,因此我們用動態規劃方式解答(c++):

#include using namespace std;

void solve(int n,int m,int** map,int** res)}}

}for(j=0;j>n;

cin>>m;

int **map=new int*[n];

int **res=new int*[n];

for(i=0;i>map[i][j];

for(i=0;i以上是動態規劃過程,我們從中可以看一下for巢狀的個數,可以發現,該演算法的複雜度為o(n^3*m),與要求的不符合,如何做到時間複雜度為o(n^3logm)呢? 

我們觀察到,我們求取步驟中,其實做了很多的無用功,比如我有4個小朋友,我要求得4段距離總和最小,如果用上面的程式,先求得2段距離最小,然後3段,然後4段,其實在後面基本上都是在原本地圖矩陣上查詢,地圖矩陣i與j之間的距離是1段的距離,當我們計算出2段距離最小時,其實可以將該矩陣作為新的地圖,即i與j之間是2段的距離,以此類推,我可以通過4段距離最小矩陣求得8段距離矩陣。此時我們需要用到遞迴,程式如下:

void solve(int n,int m,int** map,int** res)

return;

} solve(n, a, map, r);

for (i = 0; i < n; i++)

for (j = 0; j < n; j++)

for (k = 0; k < n; k++)

if (e[i][j] > r[i][k] + r[k][j])

e[i][j] = r[i][k] + r[k][j];

for (i = 0; i < n; i++)

for (j = 0; j < n; j++)

if (b == 1) }

int main()

; for (i = 0; i < n; i++) }

//求解

solve(n, m, map, r);

//列印

for (i = 0; i < n; i++)

cout << endl;

} return 0;

}

//複雜度n^3 * m

#include using namespace std;

void solve(int n, int m, vector>& map, vector>& res)}}

} for (int j = 0; j < n; j++)

res[i][j] = e[j][m - 1];

}};int main()

; for (i = 0; i < n; i++) }

solve(n, m, map, r);

for (i = 0; i < n; i++)

return 0;

}

阿里巴巴2023年提前批程式設計題解析

光明小學的小朋友們要舉行一年一度的接力跑大賽了,但是小朋友們卻遇到了乙個難題 設計接力跑大賽的線路,你能幫助他們完成這項工作麼?光明小學可以抽象成一張有n個節點的圖,每兩點間都有一條道路相連。光明小學的每個班都有m個學生,所以你要為他們設計出一條恰好經過m條邊的路徑。光明小學的小朋友們希望全盤考慮所...

阿里巴巴 2023年研發類筆試題

單選題 1.下列說法錯誤的是 a.b.c.千兆網絡卡的讀寫速度是1gb s.d.ddr3記憶體的速度是100gb s 2.下面不能用作linux程序間通訊的是 a.共享記憶體 b.管道名 c.訊號量 d.臨界區 3.cpu和i 0一次只能處理乙個程式,現有 p1 計算40ms i o80ms 計算4...

2023年阿里巴巴校招筆試題

校招找工作的同學,可以看看,非常有幫助!推薦 產品經理 阿里巴巴2015校園招聘筆試題 研發工程師 阿里巴巴2015校園招聘筆試題 研發工程師 阿里巴巴2015校園招聘筆試題2 國際安全運營專員 阿里巴巴2015校園招聘筆試題1 產品運營 阿里巴巴2015校園招聘筆試題1 前端開發工程師 阿里巴巴2...