您的位置:首页 > 其它

【ACdream OJ 1099 - 瑶瑶的第K大 (输入优化+手写O(n)快排)】

2014-07-01 12:02 501 查看
题目链接:
ACdream1099

【分析】

开始用sort直接TLE,然后只能手写快排,当找到第k大时直接return,可以接近O(n)复杂度,但是还需要用getchar()提高输入速度,否则也会超时,具体看代码

【AC代码】4096ms

#include <cstdio>
#include <ctime>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 5000010
int a[MAXN];
char ch;

int input()//快速读入,比scanf快3~5倍左右
{
while((ch = getchar()) < '0' || '9' < ch) ;
int ans = ch-'0';
while((ch = getchar()) >= '0'  && '9' >= ch) ans = ans*10+ch-'0';
return ans;
}
int q_sort(int l, int r, int k)//快排找到后直接退出
{
if (l < r)
{
int i = l, j = r, x = a[l];
while(i < j)
{
while(i < j && a[j] >= x) j--;
if (i < j) a[i++] = a[j];
while(i < j && a[i] <= x) i++;
if (i < j) a[j--] = a[i];
}
a[i] = x;
if (k == i) return a[i];
else if (i > k) return q_sort(l,i-1,k);
else return q_sort(i+1,r,k);
}
return a[l];
}
int main()
{
#ifdef SHY
freopen("e:\\1.txt","r",stdin);
#endif
int n = input(), k = input();
for (int i = 0; i < n; i++)
a[i] = input();
printf("%d\n", q_sort(0,n-1, n-k));
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IO优化 手写快排