第一次专题hdu 1280 前m大的数 hash
程序员文章站
2022-05-14 18:37:57
...
//sort方法时间超限
/*#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int dig[3005],sum[44853];
int com(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%d",&dig[i]);
}
int coun=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
sum[coun++]=dig[i]+dig[j];
}
}
sort(sum,sum+n*(n-1)/2,com);
for(int i=0;i<m;i++)
{
printf("%d ",sum[i]);
}
printf("\n");
}
return 0;
}*/
//这份代码是用hash做的,规则定义的两个值相加
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int dig[3005];
int has[10006];
//sum[44853];
//注释掉的代码是和快排不一样的部分
//空间换了时间
int main()
{
int n,m;
memset(has,0,sizeof(has));//注意不要用hash,否则评测机会给显示编译错误,显示的是结构体
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%d",&dig[i]);
}
//int coun=0;
int maxx=-1;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
//sum[coun++]=dig[i]+dig[j];
has[dig[i]+dig[j]]++;
maxx=max(maxx,dig[i]+dig[j]);
}
}
//sort(hash,sum+n*(n-1)/2,com);
int i=maxx,k=m;
while(k){
if(has[i]--){
if(k<m)
printf(" ");//这里一开始出现格式错误,注意一下
printf("%d",i);
k--;
}
else i--;
}
printf("\n");
}
return 0;
}