快速排序——HDU 1425

对应HDU 题目:点击打开链接

sort

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

[Submit]  
[Go Back]   [Status]

Description

给你n个整数,请按从大到小的顺序输出其中前m大的数。

Input

每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。

Output

对每组测试数据按从大到小的顺序输出前m大的数。

Sample Input

 5 3
3 -35 92 213 -644 

Sample Output

 213 92 3 

Hint

Hint
请用VC/VC++提交

sort, 归并,快排都能过~快排快点

快排就是,先找序列中的一个数为基数,比如第一个数a[0],使x=a[0]。之后定义i=0, j=n-1(假设数组是0~n-1)。先从后面往前找(即j--)第一个比x小的数a[j],使a[i]=a[j],再从前面往后找(即i++)第一个比x大的数,使a[j]=a[i];再从后面往前找....不断重复,最后当i==j时,使a[i]=x;结束退出。这样做实际是把比x小的都放到x前面,比x大的都放到x后面的一个过程。之后递归操作注意下边界就可以了,如果不熟悉递归,建议画下解答数模拟过程。。。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
const int MAXN=1000000+10;
using namespace std;
int a[MAXN];

void q_sort(int *A, int l, int r)
{
	if(!(l<r)) return;
	int i=l,j=r;
	int basic=A[l];
	while(i<j)
	{
		while(1)
		{
			if(j==i) break;
			if(A[j]<basic){
				A[i]=A[j]; break;
			}
			j--;
		}
		while(1)
		{
			if(j==i) break;
			if(A[i]>basic){
				A[j]=A[i]; break;
			}
			i++;
		}
	}
	A[i]=basic;
	q_sort(A,l,i-1);
	q_sort(A,i+1,r);
}

int main()
{
	//freopen("in.txt","r",stdin);
	int n,k;
	while(scanf("%d%d", &n,&k)==2)
	{
		for(int i=0; i<n; i++) scanf("%d", &a[i]);
		q_sort(a, 0, n-1);
		//for(int i=0; i<n; i++) cout<<a[i]<<" ";
		//cout<<endl;
		printf("%d", a[n-1]);
		for(int i=n-2; i>=n-k; i--)
			printf(" %d", a[i]);
		printf("\n");
	}
	return 0;
}
时间: 2024-11-05 16:10:26

快速排序——HDU 1425的相关文章

HDU 1425 sort 题解

选择出数列中前k个最大的数. 这里因为数据特殊,所以可以使用hash表的方法: #include <cstdio> #include <algorithm> #include <stdlib.h> #include <limits> using namespace std; const int SIZE = 1000005; const int SMALL = -500000; bool arr[SIZE]; int main() { int n, m, a

hdu 1425 Happy 2004

题目链接 hdu 1425 Happy 2004 题解 题目大意: 求 \[\sum_{d|2004^{x}}d\ mod\ 29\] 记为\(s(2004^x)\) \(sum(2004^{x})= s(2^2X)) * s(3^X) * s(167^X)\) $167?mod?29 = 22 $ \(s(2004^X) = s(2^{2X}) * s(3^{X})) * s(22^X)\) 此时底数变为了质数 如果p是素数 \(s(p^n)=1+p+p^2+...+p^n= (p^{n+1}

E题hdu 1425 sort

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33461    Accepted Submission(s): 9968 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Inpu

HDU 1425 sort (排序)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28997    Accepted Submission(s): 8796 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,

HDU 1425 sort (hash)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29001    Accepted Submission(s): 8799 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,

【转】HDU 1425 sort:哈希入门

#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int Size = 1000000; int Hash[Size+1]; int main() { int n, m, num; while(cin>>n>>m) { memset(Hash, 0, sizeof(Hash)); for(int i=0; i<n; i++){ s

HDU 1425 sort 【哈希入门】

题意:给出n个数,输出前m大的数 和上一题一样,将输入的数加上一个极大地值作为地址 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<algorithm> 6 using namespace std; 7 8 typedef long long LL; 9 const int M=500000; 10 int a,ha

hdu 1425 sort

这种方法也是万万没想到的~ #include<iostream> #define maxn 1000000+5 using namespace std; int f[maxn]; int n,m; int main() { cin.sync_with_stdio(false); while(cin>>n>>m) { fill(f,f+maxn,0); for(int i=0;i<n;i++) { int x; cin>>x; f[x+500000]++

HDU 1425 sort(堆排序/快排)

传送门 Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数. Output 对每组测试数据按从大到小的顺序输出前m大的数. Sample Input 5 3 3 -35 92 213 -644 Sample Output 213 92 3 1.使用内建sort函数 #include<iostream>