题目大意:给出一个序列,按照第一步本位数分别加上后边的所有数构成的一个新数列,然后新数列去重在求和?
解题思路:数据量不大,直接暴力。不过之前做的时候想到一种不用排序,直接输入进行求解的解法。这个时间复杂度相当的低,不过因为用到了数组下标的Hash,但数据的范围太大,开不下。不过方法挺好的,不知道有木有哪位大神知道这样改怎么处理,其它的详见codo.
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4989
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100+5;
const int MAXM = 10000+10;
int n,a[MAXN],m[MAXM];
long long sum;
int main(){
while(scanf("%d",&n)!=EOF){
int k=0;sum=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
m[k++]=a[i]+a[j];
sort(m,m+k);
sum+=m[0];
for(int i=1;i<k;i++)
if(m[i]!=m[i-1]) sum+=m[i];
printf("%I64d\n",sum);
}
return 0;
}