posts - 99,  comments - 8,  trackbacks - 0
用 hash  做
Accepted 1280 0MS 292K 1236B G++

//典型的hash: 用数组下标表示两两相加所得到的和,开辟一个满足题意的大小的数组 sum,
//这样下标由大到小输出m个就可以 
 
#include 
<iostream>
#include 
<string>
using namespace std;

int main ()
{
    
int a[3001];
    
int sum[10001]; 
    
int n, m;
    
while ( scanf ("%d %d"&n, &m) != EOF )
    
{
          memset ( a, 
0sizeof (a) );
          memset ( sum, 
0sizeof (sum) );
          
for ( int i = 0; i < n; i ++ )
          
{
              scanf (
"%d"&a[i]);
          }

          
          
int temp;
          
for ( int i = 0; i < n; i ++ )
          
{
              
for ( int j = i + 1; j < n; j++ )
              
{
                  temp 
= a[i] + a[j];
                  sum[temp] 
++;
              }

          }

          
          
int count = 0;      //输出前 m  个数
          for ( int i = 10001; i >= 0 ; i -- )
          
{
              
if ( sum[i] )
              
{
                   
for (int j = 0; j < sum[i]; j ++)
                   
{
                       count 
++;
                       count 
== 1 ? printf ("%d", i) : printf (" %d", i);
                          if ( count == m )
                            
break;
                   }

              
  }
 
                      if ( count == m )
                      
break;

          }

          
          printf (
"\n");
    }


    
// system ("pause");
     return 0;
}


所以改用sort排序后再输出
Accepted 1280 843MS 17888K 1304B G++
//典型的hash: 用数组下标表示两两相加所得到的和,开辟一个满足题意的大小的数组 sum,
//这样下标由大到小输出m个就可以 
 
#include <iostream>
#include <string>
using namespace std;

int sum[4500000];          //开全局数组才能过
bool cmp ( const int &a, const int &b )
{
     return a > b;
}

int main ()
{
    int a[3001];
    
    int n, m;
    while ( scanf ("%d %d", &n, &m) != EOF )
    {
          memset ( a, 0, sizeof (a) );
          memset ( sum, 0, sizeof (sum) );
          //输入处理 
          for ( int i = 0; i < n; i ++ )
          {
              scanf ("%d", &a[i]);
          }
          
          //两数求和 
          //int k = n * ( n - 1 ) / 2;
          int temp = 0;
          for ( int i = 0; i < n; i ++ )
          {
              for ( int j = i + 1; j < n; j ++ )
              {
                  sum[temp ++] = a[i] + a[j];
              }
          }
          
          sort ( sum, sum + temp, cmp );
          
          int count = 0;
          for ( int i = 0; i< temp; i ++ )
          {
              count ++;
              count == 1 ? printf ("%d", sum[i]): printf (" %d",sum[i]);
              
              if ( count == m )
              break;
          }
          printf ("\n");
    }

    // system ("pause");
     return 0;
}
posted on 2010-08-28 16:43 雪黛依梦 阅读(415) 评论(0)  编辑 收藏 引用 所属分类: 哈希法排序题

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜