九度 題目1371 最小的K個數

2021-06-22 05:02:38 字數 2348 閱讀 3315

時間限制:1 秒

記憶體限制:32 兆

特殊判題:

提交:4133

解決:856

題目描述:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

輸入:每個測試案例包括2行:

第一行為2個整數n,k(1<=n,k<=200000),表示陣列的長度。

第二行包含n個整數,表示這n個數,陣列中的數的範圍是[0,1000 000 000]。

輸出:對應每個測試案例,輸出最小的k個數,並按從小到大順序列印。

樣例輸入:

8 4

4 5 1 6 2 7 3 8

樣例輸出:

1 2 3 4

首先用快排把所有元素排列出來,在列印前k個數,這不是乙個好的方法。

#include #include #include #include using namespace std;

const int maxn = 200010;

int main()

return 0;

}

如果利用快排的思想,選主元,只要找出前k個數就可以了,但是我寫的超時了,悲催!但是這個想法比上一種好很多。

#include #include #include #include using namespace std;

const int maxn = 200010;

int partion(int* arr, int low, int high)

}tmp = arr[low];

arr[low] = arr[j];

arr[j] = tmp;

}return j;

}void quick_sort(int* arr, int low, int high)

void getnumbers(int* arr, int n, int k)

else

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

output[i] = arr[i];

sort(output, output+k);

printf("%d", output[0]);

for(i = 1; i < k; ++i)

printf(" %d", output[i]);

printf("\n");

return ;

}int main()

getnumbers(arr, n, k);

}return 0;

}

如果本題不包含重複的數,那麼就可以利用mutiset來解決。

#include #include #include #include using namespace std;

const int maxn = 200010;

int main()}}

set >::iterator iter = insertnum.begin();

int num = 0;

for(; iter != insertnum.end(); ++iter)

arr[num++] = *iter;

printf("%d", arr[k-1]);

for(i = k-2; i >= 0; --i)

printf(" %d", arr[i]);

printf("\n");

}return 0;

}

如果利用大頂堆,是可以解決這個問題的。

#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 200010;

void swap(int &a, int &b)

struct cmp

}else

(*heap).push(arr[i]);

}}void print_heap(priority_queue,cmp> *heap)

if(!s.empty())

}}int main()

} return 0;

}

九度oj 1371 最小的k個數

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 6191 解決 1309 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入 每個測試案例包括2行 第一行為2個整數n,k 1 n,k 200000 表示陣...

九度OJ 1371 最小的K個數 堆排序

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入 每個測試案例包括2行 第一行為2個整數n,k 1 n,k 200000 表示陣列的長度。第二行包含n個整數,表示這n個數,陣列中的數的範圍是 0,1000 000 ...

程式設計題目 找出最小的k個數

找出最小或者最大的幾個數我使用的是堆排序,效率為0 nlgn 構建小頂堆返回末尾的k個數 或者 構建大頂堆返回前k個數 1 usr bin env python323 defheap sort ary,num 4def siftdown ary,e,begin,end 5 i,j begin,beg...