2 条题解
-
1
竟然没人用 ,那就那 来水一发
浅谈一下 ,这是一个 库中自带的神奇函数,它的原理就是快速查找,能快速找出第 大的数。
用法如下:
运用此函数时间复杂度为 ,但是 的常数普遍较大,不过还是能通过此题的。
#include <cstdio> #include <algorithm> #define ll long long using namespace std; const int MAXN = 5e6 + 5; ll n, k, a[MAXN]; int main() { scanf("%lld%lld", &n, &k); for (int i = 0; i < n; i++) scanf("%lld", &a[i]); nth_element(a, a + k, a + n); printf("%lld\n", a[k]); return 0; }
-
0
这题属于是快排经典题了,数据范围5e6,暴力sort的话会超时,所以只能用快排,平均时间复杂度 。
唯一需要注意的是题目中说“最小的数是第0小”,坑了我老半天😕
部分代码:
ll qsort(ll L,ll R,ll k){ if(L==R) return a[L]; swap(a[L],a[L+rand()%(R-L+1)]); ll x=a[L],l=L,r=R,index=L; while(l<r){ while(l<r&&a[r]>x) r--; if(l<r) a[index]=a[r],index=r,l++; while(l<r&&a[l]<x) l++; if(l<r) a[index]=a[l],index=l,r--; } if(l-L>=k) return qsort(L,l-1,k); else if(l-L==k-1) return x; else return qsort(l+1,R,k-(l-L+1)); } 主函数中: srand(time(0)); // 以时间戳为随机种子 printf("%lld",qsort(1,n,k+1)); // 因为最小是第0小,所以这里一定要k+1
- 1
信息
- ID
- 674
- 时间
- 1000ms
- 内存
- 250MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 377
- 已通过
- 55
- 上传者