ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
来源:互联网 发布:分布式节点共识算法 编辑:程序博客网 时间:2024/04/29 18:46
ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
顺便把求数组中第K大数和求数组中第K小数的求法给出来。
代码:
/** this code is made by whatbeg* Problem: 1099* Verdict: Accepted* Submission Date: 2014-06-15 00:13:53* Time: 4340 MS* Memory: 21212 KB*/#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <cstdlib>#include <iomanip>using namespace std;#define N 1007//复杂度O(n)int Max_K(int a[],int low,int high,int k){ if(k <= 0 || k > high-low+1) return -1; int flag = low + abs(rand())%(high-low+1); //随机选择一个基准点 swap(a[low],a[flag]); int mid = low; int cnt = 1; for(int i=low+1;i<=high;i++) { if(a[i] > a[low]) //遍历,把较大的数放在数组左边 { swap(a[++mid],a[i]); cnt++; } } //比基准点大的数的个数为cnt-1 swap(a[mid],a[low]);//将基准点放在左、右两部分的分界处 if(cnt > k) return Max_K(a,low,mid-1,k); else if(cnt < k) return Max_K(a,mid+1,high,k-cnt); else return mid;} int Min_K(int a[],int low,int high,int k){ if(k <= 0 || k > high-low+1) return -1; int flag = low + abs(rand())%(high-low+1); swap(a[low],a[flag]); int mid = low; int cnt = 1; for(int i=low+1;i<=high;i++) { if(a[i] < a[low]) { swap(a[++mid],a[i]); cnt++; } } swap(a[mid],a[low]); if(k < cnt) return Min_K(a,low,mid-1,k); else if(k > cnt) return Min_K(a,mid+1,high,k); else return mid;} inline int in(){ char ch; int a = 0; while((ch = getchar()) == ' ' || ch == '\n'); a += ch - '0'; while((ch = getchar()) != ' ' && ch != '\n') { a *= 10; a += ch - '0'; } return a;} inline void out(int a){ if(a >= 10) out(a / 10); putchar(a % 10 + '0');} int a[5000006]; int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF) { getchar(); for(int i=0;i<n;i++) a[i] = in(); int res = Max_K(a,0,n-1,k); out(a[res]); puts(""); } return 0;}
0 0
- ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
- ACdream OJ 1099 瑶瑶的第K大
- 【ACdream OJ 1099 - 瑶瑶的第K大 (输入优化+手写O(n)快排)】
- ACdream 1099 瑶瑶的第K大
- ACdream 1099 - 瑶瑶的第K大
- ACdream 1099 瑶瑶的第K大
- 瑶瑶的第K大 ACdream-1099
- 【O(n)求第K大】ACdream 1099 瑶瑶的第K大
- ACdream群赛14---A题瑶瑶的第K大
- 第k大的数——分治法
- 分治法 快排 输出第k大的数
- 找第K大数(ACdream 1099)
- 第K大元素(分治法)
- ACdream OJ 1153 (k-GCD)
- ACdream群OJ 1157 cdq分治
- ACdream 1099 (STL:求数组中第k小的数)
- 分治算法求N个数中第K小(大)的数
- 分治-寻找第k小的数
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中添加自定义列办事处
- postgres 之 initdb 源码分析 一
- 多边形面积计算的演变推导过程
- 黑马程序员——Foundation学习总结7-11
- 嵌入式编程进化史
- ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
- 【足迹C++primer】表达式求值
- Java环境变量配置&解决版本不一致问题
- Android开发之自定义控件--ViewPager
- 程序员如何保持持续的进步
- 基于rman的坏块恢复
- OPENSTACK在RHEL7安装;admin创建虚拟机模板供demo使用
- 程序员必须进行的10项投资
- SurfaceView 和View 做游戏利与弊