题目大意:给出一个序列,按照第一步本位数分别加上后边的所有数构成的一个新数列,然后新数列去重在求和?
解题思路:数据量不大,直接暴力。不过之前做的时候想到一种不用排序,直接输入进行求解的解法。这个时间复杂度相当的低,不过因为用到了数组下标的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;
}
本文探讨了一个序列操作问题,通过直接暴力的方法和创新的不排序求解策略解决,同时强调了数据量较小时的优化考虑。详细介绍了算法实现和源代码解析,特别关注了一种避免排序的高效解法,尽管受限于数组下标Hash的内存限制。

被折叠的 条评论
为什么被折叠?



