C++很大的数组的第k小(选择排序)

题目

Description

求数组的第k小,数字数量非常多。

Input

每组数据给出n m k表示有n个数,求第k小,数组的数字由以下规则得到:

ai = mi mod  (109+7), i = 1, 2, ..., n

其中 1 ≤ n, m ≤ 5 × 107, 1 ≤ k ≤ n,数据保证得到的数组元素大部分互不相等。

Output

输出第k小的数

代码

没必要用快排把整个数组都排成有序的 。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


const int maxn = 50000000;
int a[maxn];
void swap(int& a, int& b)
{
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
int ss(int *a,int low,int high,int k)
{
    int i = low, j = high;
    int pri = a[i];
    while (i < j)
    {
        while (a[j] >= pri && i < j) {
            j--;
        }
        if (i < j) {
            a[i] = a[j];
            i++;
        }
        while (a[i] <= pri && i < j) {
            i++;
        }
        if (i < j) {
            a[j] = a[i];
            j--;
        }
    }
    a[i] = pri;
    if (i == (k - 1)) {
        return pri;
    }
    else if (i < (k - 1)) {
        return (ss(a, i + 1, high, k));
    }
    else {
        return (ss(a, low, i - 1, k));
    }

}

int main()
{
    int n, m, k;
    scanf("%d %d %d", &n, &m, &k);
    int mod = 1e9 + 7;
    a[0] = m;
    for (int i = 1; i < n; i++)
            a[i] = 1LL * a[i - 1] * m % mod;

    ss(a, 0, n - 1, k);
    printf("%d\n", a[k - 1]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/white_night_SZTU/article/details/129896423