题解
题目描述
给定一个集合 s(集合元素数量≤30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素 ≤1000)
输出格式
s 所有子集元素之和。
输入输出样例
输入 #1
2 3
输出 #1
10
说明/提示
【样例解释】
子集为:∅,{2},{3},{2,3},和为2+3+2+3=10。
【数据范围】
对于100% 的数据,1≤∣s∣≤30,1≤s[i]≤1000,s 所有子集元素之和≤10^18。
分析
首先,题目中并没有提示输入终止的条件,因此输入是个问题;
其次,我们来分析一下子集元素和的规律:
集合 子集 和
{2} {2} 2
{2,3} {2},{3},{2,3} 2+3+2+3(2*(2+3))即(2^(2-1)*(2+3))
{1,2,3} {1},{2},{3},{1,2},{1,3},{2,3} ,{1,2,3} #1+2+3+1+2+1+3+2+3+1+2+3(4*(1+2+3))#
#即2^(3-1)*(1+2+3) #
{1,2,3,4} # {1},{2},{3},{4},{1,2}, # # 1+2+3+4+1+2+1+3+1+4+2+3+2+4+3+4 #
#{1,3},{1,4},{2,3} ,{2,4},# #+1+2+3+1+2+4+1+3+4+2+3+4+1+2+3+4#
# {3,4},{1,2,3},{1,2,4}, # #( 8*(1+2+3+4)即2^(4-1)*(1+2+3+4) #
#{1,3,4},{2,3,4},{1,2,3,4}
由上便得出规律:
当集合共有n个元素时,
{1+2+3+4+5+...+n} ......
和为 2^(n-1)*(集合所有元素之和,即1+2+3+...+n)
于是,就可以写代码了...
参考AC代码
#include <bits/stdc++.h>//万能头文件using namespace std;
int main() {
//数据范围超过int类型,因此要用long long
// 数据输入个数
long long n;
// 元素个数
long long t= 0;
// 最终求和
long long sum = 0;
// 将所有数据求和 并记录个数
while (cin >> n) {
sum += n;
t++;
}
cout << (long) pow(2, t - 1) * sum << endl;/*公式, 2^(n-1)*(集合所有元素之和,即 1+2+3+...+n) pow为幂函数*///
return 0;
}
感受
这道题趋向于数学范畴,要找规律,将所有子集列出来后再得出求和公式,方能AC.