不理解t在哪里,玄关

P1923 【深基9.例4】求第 k 小的数

SIRIUS0105 @ 2024-03-05 17:38:11

发疯搞了一个桶排

然后光荣地T了

#include <iostream> 
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;
const int N = 5000001;

int data[N], num, idx; 

//桶排序 
void BucketSort(int a[], int n)
{
    int minval = a[0], maxval = a[0];
    for(int i = 0; i < n; i ++)
    {//寻找原序列数组元素的最大值和最小值 
        minval = min(minval, a[i]);
        maxval = max(maxval, a[i]);
    }

    int bnum = 100;//桶中元素个数 
    int m = (maxval - minval) / bnum + 1;//桶的个数 
    vector< vector<int> > bucket(m);

    //收集,将元素入相应的桶中. 减偏移量是为了将元素映射到更小的区间内,省内存 
    for(int i = 0; i < n; i ++) 
    {
        bucket[(a[i] - minval) / bnum].push_back(a[i]);
    }

    //将桶内元素排序 
    for(int i = 0; i < m; i ++) 
    {
        sort(bucket[i].begin(), bucket[i].end());
    }

    //收集, 将各个桶中的元素收集到一起 
    for(int i = 0, k = 0; i < m; i ++)
    {
        for(int j = 0; j < bucket[i].size(); j ++)
        {
            data[k++] = bucket[i][j];
        }
    }
}
int main() 
{
    int n, k;
    cin >> n >> k;

    //int a[100001], temp;
    for(int i=0; i<n; i++)
    {
        cin >> data[i];
    }

    BucketSort(data, n);

    cout << data[k];

    return 0;
}

。。。。。

求解


by SIRIUS0105 @ 2024-03-05 20:06:10

老实写了一遍快排,一遍过


上一页 |