40分求助

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

soyoungsolong @ 2022-07-12 11:47:52

第三点WA,四五点TLE

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k;
    int a[5000001];
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    cout<<a[k];
    return 0;
}

by Enthon_Yuan @ 2022-07-12 11:49:15

题目:最小的数是第 0 小。


by Enthon_Yuan @ 2022-07-12 11:50:58

输入k之后k+1就可以了,而且这道题不用分治?


by ben090302 @ 2022-07-12 13:41:15

@soyoungsolong 快排时间复杂度炸了。 要分治思想

#include<bits/stdc++.h>
using namespace std;
int a[500000001],n,k;
int find(int l,int r) {
    if(l == r && l == k) return a[k];
    if(l < r) {
        int i = l,j = r;
        int tmp = a[l];
        while(i < j) {
            while(i < j &&a[j] >= tmp) --j;
            if(i < j) swap(a[i],a[j]);
            while(i < j && a[i] <= tmp) ++i;
            if(i < j) swap(a[i],a[j]);
        }
        a[i] = tmp;
        if(i == k) return a[k];
        if(i > k) return find(l,i - 1);
        else return find(i + 1,r);
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    k++;
    for(int i = 1;i <= n;i++) cin>>a[i];
    int key = find(1,n);
    cout<<key;
    return 0;
}

无语,真就不看数据范围? 还有,最小的数是第0小啊


|