不理解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 HEROBRINEH @ 2024-03-05 17:41:42

根本不用这么复杂

#include <iostream>
#include <algorithm>
using namespace std;
long long number[5000005];
int main() {
    ios::sync_with_stdio(0);
    int n, k;
    cin >> n >> k;
    for (int a = 0; a < n; a++)  cin >> number[a];
    sort(number, number + n);
    cout << number[k];
}

by momentary_hunter @ 2024-03-05 17:42:48

@HEROBRINEH 对呀


by QWQ_123 @ 2024-03-05 17:56:40

@SIRIUS0105 5 \times 10^5 你以为是什么概念?常数太大了(


by 杜都督 @ 2024-03-05 17:57:24

TLE应该是因为 n5e6 级别,数据量过大导致读写超时,可以考虑使用快读快写,如:

ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

但即便是这样,用桶排还是会导致MLE,因为 a_i1e9 级别的

@SIRIUS0105


by QWQ_123 @ 2024-03-05 18:00:36

@杜都督 其实只需要将 bnum 变大即可。


by 杜都督 @ 2024-03-05 18:09:09

@QWQ_123 你说得对,我测试了一下,bnum 改到 1e4 就能A了

@SIRIUS0105


by QWQ_123 @ 2024-03-05 18:13:54

@杜都督 他这个是按照每 bnum 个数字分一块,然后对每一块使用快排(所以当bnum足够大就是快排,bnum足够小就是纯桶排。

所以这个东西不如直接快排(


by 杜都督 @ 2024-03-05 18:25:22

@QWQ_123 桶排的本质就是这样嘛,这道题用来练练手,写写自己喜欢的排序也是好的(


by SIRIUS0105 @ 2024-03-05 19:44:59

@杜都督 :)


by SIRIUS0105 @ 2024-03-05 20:05:21

@杜都督 已关:)


| 下一页