超级传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1280
由于N<=3000,它们和的组合N*(N-1)/2是一个比较大的数,直接暴力求解必然TLE。不过题目中说了:每个数不超过5000,而且都是正整数,所以可以用hash来尝试一下。
#include<stdio.h>
int main () {
int n,m,i,j,first,a[3003],hash[10010]={0};
while (scanf("%d%d",&n,&m) != EOF) {
for (i=0;i<n;i++) scanf("%d",&a[i]);
for (i=0;i<n;i++) {
for (j=i+1;j<n;j++) {
hash[a[i]+a[j]] ++;
}
}
first = 1;
for (i=10000;i>=0;i--) {
if (hash[i]) {
if (m>=hash[i]) {
for (j=1;j<=hash[i];j++) {
if (first) {
first = 0;
} else printf(" ");
printf("%d",i);
}
m -= hash[i];
} else {
for (j=1;j<=m;j++) {
if (first) {
first = 0;
} else printf(" ");
printf("%d",i);
}
m = 0;
printf("\n");
break;
}
}
}
}
return 0;
}
时间是0MS,hash还是很给力的。