本题用快排也可以过 (时间复杂度(nlgn)); Hash 时间复杂度 n;
快排:
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int maxn=1000000+10;
- int a[maxn];
- bool cmp(int a,int b){return a>b;}
- int main(){
- int n,m;
- while(scanf("%d%d",&n,&m)==2){
- for(int i=0;i<n;i++)scanf("%d",&a[i]);
- sort(a,a+n,cmp);
- printf("%d",a[0]);
- for(int i=1;i<m;i++)printf(" %d",a[i]);
- printf("\n");
- }
- return 0;
- }
Hash:
- #include<cstdio>
- #include<cstring>
- const int maxn=1000000+10;
- int hash[maxn];
- int main(){
- int n,m;
- while(scanf("%d%d",&n,&m)==2){
- memset(hash,0,sizeof(hash));
- for(int i=0;i<n;i++){
- int temp;
- scanf("%d",&temp);
- hash[500000+temp]=1;
- }
- int t=m;
- for(int i=maxn-1;m>0;i--){ //有一点不清楚的是这里不能写出 i=sizeof(hash)-1;????
- if(hash[i]){
- if(m==t)
- printf("%d",i-500000);
- else printf(" %d",i-500000);
- m--;
- }
- }
- printf("\n");
- }
- return 0;
- }
练习本题的目的是学会运用Hash求解问题。