一,題目:(谷歌筆試)
n支隊伍比賽,分別編號為0,1,2……n-1,已知它們之間的實力對比關係,儲存在乙個二維陣列w[n][n]中,w[i][j] 的值代表編號為i,j的隊伍中更強的一支。
所以w[i][j]=i 或者j,現在給出它們的出場順序,並儲存在陣列order[n]中,
比如order[n] = ,那麼第一輪比賽就是 4對3, 5對8。.......
勝者晉級,敗者淘汰,同一輪淘汰的所有隊伍排名不再細分,即可以隨便排,
程式設計實現,給出二維陣列w,一維陣列order 和 用於輸出
比賽名次
的陣列result[n],求出result(特別注意:result輸出的是從第一名到最後一名)
二,分析
這裡有乙個簡單的做法,就是:檢視每一行重複數字個數,如果重複數字個數為n則排名為1,重複數字個數n-1則排名為2。所以重複數字個數為i個,則排名為n+1-i;給出order,則相應的result很容易得出。這裡值得注意的是:order僅僅為出場順序,跟result沒有任何關係。
對應原始碼為:
#include #include using namespace std;
/*order 順序為pk順序*/
int main()
;
int order[6] = ;
int weight[6];//2,3,6,1,4,5
int result[6];
int max;
for(int i=0;i<6;i++)
;for(int j=0;j<6;j++)
for(int k=0;k<6;k++)//獲取排名
else
if(i!=0)
if(count==0)
result[0]=order[0];
}
// cout<<"count "《上述原始碼中,明顯的缺點就是,通過記錄重複個數來判斷哪個優先順序高。這裡完全可以根據兩個元素行與列交叉處值來判斷。
改進後原始碼:
#include #include using namespace std;
/*order 順序為pk順序*/
int main()
;
int order[6] = ;
int result[6];
int count=6;
int count_left=0;
int flag;
while(count)
else
if(i!=0)
if(count==0)
result[0]=order[0];
}
} for(int i=0;i<6;i++)
int resultnum = count - 1;
int nfirst, nsecond;
int round = 1;
while(winer.size() > 1)
;
int order[6] = ;
int result[6] = ;
raceresult((int**)w, order, result, 6);
getchar();
}//自己加上主函式,測試了下,結果竟正確..
int main()
///
round 1
1 kick out 3
2 kick out 4
0 kick out 5
round 2
2 kick out 1
0 rest this round
round 3
2 kick out 0
final result:20
1543
/
100題 第三十六 比賽淘汰問題(谷歌筆試)
一,題目 谷歌筆試 n支隊伍比賽,分別編號為0,1,2 n 1,已知它們之間的實力對比關係,儲存在乙個二維陣列w n n 中,w i j 的值代表編號為i,j的隊伍中更強的一支。所以w i j i 或者j,現在給出它們的出場順序,並儲存在陣列order n 中,比如order n 那麼第一輪比賽就是...
求比賽名次 微軟面試100題 第三十六題
題目要求 n支隊伍比賽,分別編號為0,1,2,n 1,已知它們之間的實力對比關係儲存在乙個二維陣列w n n 中,w i j 的值代表編號為i,j的隊伍中更強的一支,所以w i j i或者j.現在給出它們的出場順序,並儲存在陣列order n 中,比如order n 那麼第一輪比賽就是4對3,5對8...
第三十六節 C 菱形問題的解決 虛繼承
菱形問題 三個派生類同時繼承乙個基類,又存在另乙個派生類同時繼承這三個派生類。這將導致建立三個基類物件 calss one 當我們通過three去呼叫one的函式實現時,將出現錯誤,編譯器不知道呼叫哪個one的函式,這將是我們不願意發生的。include using namespace std cl...