zoukankan      html  css  js  c++  java
  • hdu 1280 前m大的数

    题目 :

    Problem Description
    还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的M个数告诉她就可以了。 
    给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。
     
    Input
    输入可能包含多组数据,其中每组数据包括两行: 
    第一行两个数N和M, 
    第二行N个数,表示该序列。

    Output
    对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
     
    Sample Input
    4 4
    1 2 3 4
    4 5
    5 3 6 4
     
    Sample Output
    7 6 5 5
    11 10 9 9 8

     哈希表:

      

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 
     7 int main(){
     8     int n,m,x,A[3005],hash[10005],flag,i,j;
     9     while( cin >>n >>m ){
    10         memset(hash,0,sizeof(hash));
    11         for(  i=1;i<=n;i++)
    12             cin >>A[i];
    13         sort(A+1,A+n+1);
    14         x=0;
    15         for( i=n;i>n-m+1;i--)
    16             for(  j=i-1;j>n-m;j--)
    17                 hash[A[i]+A[j]]++;
    18         flag=0;
    19         for(  i=10004;i>=0;i--){
    20             for( j=hash[i];j>0;j--){
    21                 cout <<i ;
    22                 m--;
    23                 flag=1;
    24                 hash[i]--;
    25                 break;
    26             }
    27             if( flag ) break;
    28         }
    29         for(  ;i>=0;i--){
    30             for( j=hash[i];j>0;j--){
    31                 cout <<" " <<i ;
    32                 m--;
    33                 flag=1;
    34                 if( m==0 ) break;
    35             }
    36             if( m==0 ) break;
    37         }
    38         cout <<endl;
    39     }
    40     return 0;
    41 }
    View Code

    非哈希:

     1 #include<iostream>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 
     6 int sum[1000000];
     7 
     8 int main(){
     9     int n,m,x,A[3005];
    10     while( cin >>n >>m ){
    11         for( int i=1;i<=n;i++)
    12             cin >>A[i];
    13         sort(A+1,A+n+1);
    14         x=0;
    15         for( int i=n;i>n-m+1;i--)
    16             for( int j=i-1;j>n-m;j--)
    17                 sum[++x]=A[i]+A[j];
    18         sort(sum+1,sum+x+1);
    19         cout <<sum[x];
    20         for( int i=x-1;i>x-m;i--)
    21             cout <<" " <<sum[i];
    22         cout <<endl;
    23     }
    24     return 0;
    25 }
    View Code
  • 相关阅读:
    装饰器模式
    原型模式
    观察者模式
    Apollo 代码的编译演示
    Apollo 框架的剖析1
    gPRC学习笔记
    Docker入门
    ROS入门学习
    Mudo C++网络库第十一章学习笔记
    Mudo C++网络库第十章学习笔记
  • 原文地址:https://www.cnblogs.com/lysr--tlp/p/fffff.html
Copyright © 2011-2022 走看看