用敗者樹從N個數中選擇最大的k個數字

2021-06-01 19:32:34 字數 1398 閱讀 1852

20   21   24   29   36   45   56   69   84   101   120   141   164   189   16   45   76   109   144   181   20   61   104   149   196   45   96   149   4   61   120   181   44   109   176   45   116   189   64   141   20   101   184   69   156   45   136   29   124   21   120   21   124   29   136   45   156   69   184   101   20   141   64   189   116   45   176   109   44   181   120   61   4   149   96   45   196   149   104   61   20   181   144   109   76   45   16   189   164   141   120   101   84   69   56   45   36   29   24   21  

184  184  189  189  189  189  196  196

#include 

#include

typedef  struct  wrap_data

wrap_data;

int choosevec(int path)

else if (path<=8)

else if(path<=16)

else

}wrap_data **vec;

int  vecsize;

void    up ( int num )

if ( first->path==second->path)

else if ( *( second->data  )>  *( first->data  ))

else }}

int  main()

;wrap_data a[path]=;

int  label=0;

vecsize=2*    choosevec(path);

vec=(wrap_data **)calloc( vecsize ,sizeof (wrap_data*));

for(i=0;ifor(i=0;ik=vecsize/2;

for(i=0;i

while(label data))

else

label++;

}//dump

printf("\n");

i=0;

while(i++data));

vec[0]=0;

*(result->data)=max_big;

up  (result->path+k);

從n個數中選擇k個數

這是組合問題,組合問題有幾種寫法,且時間複雜度位o n 2 1 暴力迴圈,適用於固定的k 比方從7個數中找兩個數 int main sort nums.begin nums.end int count 0 for int i 0 i nums.size i cout count 2 當前數選不選,遞...

從m個數中選擇n個數的實現

從m個數中選出n個數來 0 n m 要求n個數之間不能有重複,其和等於乙個定值k。求一段程式,羅列所有的可能。例如備選的數字是 11,18,12,1,2,20,8,10,7,6 和k等於 18 那麼組合的可能有 18 8,10 2,20 12,6 11,7 11,1,6 1,10,7 12,2,8 ...

從M個數中選擇前N大的數

如果對m個數字全排列,1 用簡單排序演算法,例如氣泡排序,時間複雜度m m 2 用快速排序 最壞時間複雜度度蛻化為m m 堆排序歸併排序 平均時間負責度為m logm 此處,需要選擇前n大的數,用氣泡排序,迴圈次數為n,時間複雜度為m n 如果是海量資料呢?筆試時經常碰到這樣類似的題目 從100w個...