tle求助!谢谢。

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

kissu @ 2023-08-18 10:25:58

#include<bits/stdc++.h>
using namespace std;
int jiaqs(int a[],int l,int h,int k){
    if(l==h)return a[l];
    int i=l-1,j=h+1,v=a[h],index=h;
    while(i<j){
        while(++i<=v)if(i==j)goto xycfq;
        a[index]=a[i];index=i;
        while(--j>=v)if(i==j)goto xycfq;
        a[index]=a[j];index=j;
    }
    xycfq:a[i]=v;
    if(i>k)return jiaqs(a,l,i-1,k);
    else if(i==k)return a[i];
        else return jiaqs(a,i+1,h,k);
}
int main(){
    int n,k;
    cin>>n>>k;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cout<<jiaqs(a,0,n-1,k);
    return 0;
}

by xiaoyun233 @ 2023-08-18 10:57:30

咳咳,如果你懒直接sort就行了 用sort时间复杂度为O(n logn),这个题绝对会超时,但是可以用以下方法压缩时间:

1.使用快读/只用printf和scanf/只用cin和cout并在main函数开头加上一句话

main(){
ios::sync_with_stdio(0)
·····

以此来增加读写速度

2.for 循环的临时变量前面加上register关键字比如

for(register int i=0;i<m;i++)······

(可能现在对于版本C++作用不是很大)

3.开启O2优化!!!(最重要)


by xiaoyun233 @ 2023-08-18 11:00:40

@kissu 我不知道用你的代码行不行,反正我只用了9行 (不用using namespace std能省一行awa)

#include<bits/stdc++.h>
long n,k,A[5000000];
int main(){
    std::ios::sync_with_stdio(0);
    std::cin>>n>>k;
    for(register int i=0;i<n;i++)std::cin>>A[i];
    std::sort(A,A+n);
    std::cout<<A[k];
    return 0;}

(必须开O2优化)


by xiaoyun233 @ 2023-08-18 11:09:38

@kissu

补充:

4.对于这道题,n和k/存入的数据只需要用int,开long long更费时间(虽然你没开)


by RKSSSKR @ 2023-08-18 11:11:25

你把输出改一下就行了


by RKSSSKR @ 2023-08-18 11:12:09

输出改完后,你的代码还是有点问题。


|