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
//懷疑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;
}