Input
输入有多个测试用例,每个测试用例是两行:
第1行是两个整数N和K,中间用空格隔开(N ≥ K)
第2行有N个整数,每两个数字中间用空格隔开
输入以EOF结束
Output
对于每一个测试用例,输出一行,K个整数,就是它的前K大的整数,按照降序排列输出,每两个数字之间用空格隔开,最后一个数字后面没有空格,有换行。
Sample Input
5 2 3 2 4 1 5
Sample Output
5 4
—————————————————————————————————————————————————————————————————————————————
思路:
1、建立前k个数的小根堆,堆顶为k个数中最小数
2、剩余n - k个数用arr[i]表示,堆顶用maxArr[0]表示
3、如果maxArr[0] < arr[i],则maxArr[0] = arr[i],并重新建立小根堆,使得堆顶重新为最小数;
如果maxArr[0] >= arr[i],则i++,继续比较
<pre name="code" class="cpp">#include <iostream>
int arr[10001], n, k, count;
int maxArr[10001];
//小根堆排序
int minHeap(int i) {
int cha = 0;
if (i == 0) {
return 0;
}
int temp;
if (i % 2 == 0) {
if (maxArr[i - 1] <= maxArr[i]) {
if (maxArr[i - 1] < maxArr[(i - 1) / 2]) {
temp = maxArr[i - 1];
maxArr[i - 1] = maxArr[(i - 1) / 2];
maxArr[(i - 1) / 2] = temp;
cha++;
}
} else {
if (maxArr[i] < maxArr[(i - 1) / 2]) {
temp = maxArr[i];
maxArr[i] = maxArr[(i - 1) / 2];
maxArr[(i - 1) / 2] = temp;
cha++;
}
}
i -= 2;
} else {
if (maxArr[i] < maxArr[(i - 1) / 2]) {
temp = maxArr[i];
maxArr[i] = maxArr[(i - 1) / 2];
maxArr[(i - 1) / 2] = temp;
cha++;
}
i--;
}
cha += minHeap(i);
return cha;
}
//堆顶元素更改后重新建立小根堆
void chaTop() {
int temp;
int i = 0;
while (1) {
if (2 * i + 1 < k && 2 * i + 2 >= k) {
if (maxArr[i] > maxArr[2 * i + 1]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 1];
maxArr[2 * i + 1] = temp;
i = 2 * i + 1;
} else {
break;
}
} else if (2 * i + 1 >= k) {
break;
} else {
if (maxArr[2 * i + 1] <= maxArr[2 * i + 2]) {
if (maxArr[i] > maxArr[2 * i + 1]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 1];
maxArr[2 * i + 1] = temp;
i = 2 * i + 1;
} else {
break;
}
} else {
if (maxArr[i] > maxArr[2 * i + 2]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 2];
maxArr[2 * i + 2] = temp;
i = 2 * i + 2;
} else {
break;
}
}
}
}
return;
}
//删除堆顶,并重新建立小根堆
void delTop(int max) {
int temp;
int i = 0;
temp = maxArr[0];
maxArr[0] = maxArr[max - 1];
maxArr[max - 1] = temp;
max--;
while (1) {
if (2 * i + 1 < max && 2 * i + 2 >= max) {
if (maxArr[i] > maxArr[2 * i + 1]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 1];
maxArr[2 * i + 1] = temp;
i = 2 * i + 1;
} else {
break;
}
} else if (2 * i + 1 >= max) {
break;
} else {
if (maxArr[2 * i + 1] <= maxArr[2 * i + 2]) {
if (maxArr[i] > maxArr[2 * i + 1]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 1];
maxArr[2 * i + 1] = temp;
i = 2 * i + 1;
} else {
break;
}
} else {
if (maxArr[i] > maxArr[2 * i + 2]) {
temp = maxArr[i];
maxArr[i] = maxArr[2 * i + 2];
maxArr[2 * i + 2] = temp;
i = 2 * i + 2;
} else {
break;
}
}
}
}
return;
}
void print() {
for (int i = 0; i < k; i++) {
std::cout << maxArr[i];
if (i != k - 1) {
std::cout << " ";
}
}
std::cout << std::endl;
}
int main() {
while (std::cin >> n) {
std::cin >> k;
for (int i = 0; i < n; i++) {
std::cin >> arr[i];
if (i < k) {
maxArr[i] = arr[i];
}
}
while (minHeap(k - 1));
for (int i = k; i < n; i++) {
if (arr[i] > maxArr[0]) {
maxArr[0] = arr[i];
chaTop();
}
}
count = k - 1;
for (int i = 0; i < k; i++) {
delTop(k - i);
}
print();
}
return 0;
}