题目大意:
有N个数,让他们两两求和,得到 (n)*(n-1)/2 个数,让你输出前m大个数(从大到小)
思路:将各种组合可能得到的和作为下标,然后因为不同组合得到的和可能是一样的,
所以再用一个数组cnt[]数组,就可以将相同的和都记录下来
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
int a[3005],cnt[10005];
bool hsh[10005];
int main ()
{
int m,n;
while (~scanf("%d%d",&n,&m))
{
int i;
for (i=0;i<n;i++)
scanf("%d",&a[i]);
memset (hsh,0,sizeof(hsh));
memset (cnt,0,sizeof(cnt));
for (i=0;i<n;i++)
for (int j=i+1;j<n;j++)
{
hsh[a[i]+a[j]]=true;
cnt[a[i]+a[j]]++;
}
for (i=10000;m>=1;i--)//每个数<=5000,和的大小为<=10000
if (hsh[i]==true)
while (cnt[i]-- && m)
printf(m-->1?"%d ":"%d\n",i);
}
return 0;
}