@
  • 板块灌水区
  • 楼主lucy2012
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/8/28 21:54
  • 上次更新2024/8/29 10:01:02
查看原帖
@
1252442
lucy2012楼主2024/8/28 21:54
#include<bits/stdc++.h>
using namespace std; 

int sum;
int a[2001];

int select(int l, int r, int k) {
    sum++;
    int m = a[(l + r) / 2], t;
    int i = l, j = r;
    while (i <= j) {
        while (a[i] > m) i++;
        while (a[j] < m) j--;
        if (i <= j) {
            t = a[i]; a[i] = a[j]; a[j] = t;
            i++; j--;
        }
    }
    if (k <= j) return select(l, j, k);
    if (k >= i) return select(i, r, k);
    return a[k];
}

int main() {
    int n, k;
    cin >> n >> k;
    sum = 0;
    for (int i = 1; i <= n; i++) cin >> a[i];
    cout << select(1, n, k) << " ";
    cout << sum << endl;
    return 0;

3) 输入 1: 10  3  6  2  1  8  7  9  4  5  10  3  输出 1: (D)
A. 33  B. 34  C. 83  D. 84

4) 输入 2: 1000  13  12  34..  998  999  1000  输出 2: (C)
A. 1310  B. 1311  C. 988  D. 98810

解析(没有理解交换的步骤是如何进行的):

以下是从图中提取的文字:

  1. 数据范围不大,直接模拟一下就行了。 开始: 62187945103 第一轮 i=1,j=10,结束后: 10978124563 此时 i=5,j=4 第二轮 i=1,j=4,结束后: 10978 此时 i=3,j=1 第三轮 i=3,j=4,结束后: 87 此时 i=4,j=3 第四轮 i=3,j=3,找到答案 8 结束,输出 84。

  2. 虽然数据范围很大,但是其实第一轮结束后就全部排好序了。因此只需要考虑 i,r,i,j 的值即可。
    第一轮: i=1,r=1000,i=501,j=500
    第二轮: i=1,r=500,i=251,j=249
    第三轮: i=1,r=249,i=126,j=124
    第四轮: i=1,r=124,i=63,j=61
    第五轮: i=1,r=61,i=32,j=30
    第六轮: i=1,r=30,i=16,j=14
    第七轮: i=1,r=14,i=8,j=6
    第八轮: i=8,r=14,i=12,j=10
    第九轮: i=12,r=14,此时第 k 个位置恰好是中位数,直接输出结果 988 9

2024/8/28 21:54
加载中...