sort
http://acm.hdu.edu.cn/showproblem.php?pid=1425
Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12895 Accepted Submission(s): 3622
5 3 3 -35 92 213 -644
213 92 3HintHint
//怀疑hdu的数据有点弱啊,下面这个代码竟AC了,明明这题是考hash嘛
//不过用时花了921ms,差那么一点点就TLE了,不能侥幸啊,还是该用hash做
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int hash[1000001];
bool compare(int a,int b){
return a>b;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&hash[i]);
sort(hash,hash+n,compare);
for(int i=0;i<m-1;i++)
printf("%d ",hash[i]);
printf("%d\n",hash[m-1]);
}
return 0;
}
下面是hash做法
//题目中的数据范围都是【-500000,500000】,并且总数不超过1000000
//那么值加上500000即为存储的下标,下标越大值越大,这样就不用排序了
//用时671ms
#include<iostream>
int hash[1000001];
int main(){
int n,m,temp,cnt;
while(scanf("%d%d",&n,&m)!=EOF){
memset(hash,0,sizeof(hash));
for(int i=0;i<n;i++){
scanf("%d",&temp);
hash[temp+500000]=1;
}
cnt=0;
for(int i=1000000;i>=0;i--){
if(hash[i]==1){
if(cnt==m-1){
printf("%d\n",i-500000);
break;
}
printf("%d ",i-500000);
cnt++;
}
}
}
return 0;
}
如果允许其中有数据相同,相应的代码如下:
#include<iostream>
int hash[1000001];
int main(){
int n,m,temp,cnt;
while(scanf("%d%d",&n,&m)!=EOF){
memset(hash,0,sizeof(hash));
for(int i=0;i<n;i++){
scanf("%d",&temp);
hash[temp+500000]++; //存放这个数的数量
}
cnt=0;
for(int i=1000000;i>=0;i--){
if(hash[i]>0){
for(int j=0;j<hash[i];j++){
if(cnt==m-1){
printf("%d\n",i-500000);
cnt++;
break;
}
printf("%d ",i-500000);
cnt++;
}
if(cnt==m)
break;
}
}
}
return 0;
}