题目链接:前m大的数
题目大意:给出n个数,两两求和,求m大的和
题目分析:
1、直接sort,780ms
2、hash[a[i]+a[j]]++,i=maxsum,i--,从后往前输出n个
注意:输出格式问题
固定格式
for(int i=0;i<m;i++){
if(i!=0)printf(" ");
printf("%d",sum[i]);
}
printf("\n");
代码一,sort:
#include <stdio.h>
#include<algorithm>
using namespace std;
const int maxn=3000*1500+5;
int sum[maxn];
int a[3005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int tot=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
sum[tot++]=a[i]+a[j];
}
}
sort(sum,sum+tot,cmp);
for(int i=0;i<m;i++){
if(i!=0)printf(" ");
printf("%d",sum[i]);
}
printf("\n");
}
return 0;
}
代码2,hash
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;
int a[3005];
int h[10005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m,Max;
while(scanf("%d %d",&n,&m)!=EOF){
Max=-1;
memset(h,0,sizeof(h));
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int tot=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
h[a[i]+a[j]]++;
Max=max(Max,a[i]+a[j]);
}
}
int k=m,i=Max;
while(k){
if(h[i]--){
if(k!=m)printf(" ");
printf("%d",i);
k--;
}
else i--;
}
printf("\n");
}
return 0;
}