sort
Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34092 Accepted Submission(s): 10113
Problem 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
这个题试着提交了很多次,好像只有快排才能ac......
关于快排,代码比较复杂,用的时候直接调用c++里面的sort函数了....
这样比较简单,具体sort函数怎么用,网上可以自己搜搜相关资料,这里不详述了......
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int cmp (int a,int b)
{
return a>b;
}
int x[1000005];
int main()
{
int n,m,i;
while(~scanf("%d%d",&n,&m))
{
memset(x,0,sizeof(x));
for(i=0;i<n;++i)
{
scanf("%d",&x[i]);
}
sort(x,x+n,cmp);
for(i=0;i<m-1;++i)
{
printf("%d ",x[i]);
}
printf("%d\n",x[i]);
}
return 0;
}
其实还可以手写一个快排......练练手还是可以的,嘿嘿..
#include<stdio.h>
#include<string.h>
void sort(int x[],int left,int right)
{
if(left<right)
{
int key=x[left],i=left,j=right;
while(i<j)
{
while(x[j]<=key&&i<j)
{
--j;
}
x[i]=x[j];
while(x[i]>=key&&i<j)
{
++i;
}
x[j]=x[i];
}
x[i]=key;
sort(x,left,i-1);
sort(x,i+1,right);
}
}
int x[1000005];
int main()
{
int n,m,i;
while(~scanf("%d%d",&n,&m))
{
memset(x,0,sizeof(x));
for(i=0;i<n;++i)
{
scanf("%d",&x[i]);
}
sort(x,0,n-1);
for(i=0;i<m-1;++i)
{
printf("%d ",x[i]);
}
printf("%d\n",x[i]);
}
return 0;
}