100題 第三十六 比賽淘汰問題(谷歌筆試)

2021-06-18 06:44:47 字數 4174 閱讀 3706

一,題目:(谷歌筆試)

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沒有任何關係。

對應原始碼為:

[html]view plain

copy

print?

#include <

iostream

>

#include <

stack

>

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++)//獲取排名  

weight[i]=7-max;//排名         

}  int n=6;  

int count=6;  

int count_left=0;  

int flag;  

while(count)  

else  

if(i!=0)   

if(count==0)  

result[0]=order[0];  

}     

//  cout<

<"count "<

<

count

<

<

endl;  

}  //result[0]=weight[order[i]];  

for(int i=0;i<

6;i++)  

return 0;  

}  

#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 "《上述原始碼中,明顯的缺點就是,通過記錄重複個數來判斷哪個優先順序高。這裡完全可以根據兩個元素行與列交叉處值來判斷。

改進後原始碼:

[html]view plain

copy

print?

#include <

iostream

>

#include <

stack

>

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++)  

return 0;  

}  

#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)     

else    

else    

}     

}     

}   

if (winer.size() == 1)     

cout<

<

endl

<

<"final result: ";     

int nplace = 0;     

while(nplace <

count)     

}  void test()     

;     

int order[6] = ;     

int result[6] = ;     

raceresult((int**)w, order, result, 6);     

getchar();     

}  //自己加上主函式,測試了下,結果竟正確..  

int main()    

#include #include #include using namespace std;

void raceresult(int** w, int* order, int* result, int n)

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...