P2415 集合求和

题目

给定一个集合 s s s(集合元素数量 ≤ 30 \le 30 30),求出此集合所有子集元素之和。

输入格式

集合中的元素(元素 ≤ 1000 \le 1000 1000

输出格式

s s s 所有子集元素之和。

样例 #1

样例输入 #1

2 3

样例输出 #1

10

提示

【样例解释】

子集为: ∅ , { 2 } , { 3 } , { 2 , 3 } \varnothing, \{ 2 \}, \{ 3 \}, \{ 2, 3 \} ,{2},{3},{2,3},和为 2 + 3 + 2 + 3 = 10 2 + 3 + 2 + 3 = 10 2+3+2+3=10


【数据范围】

对于 100 % 100 \% 100% 的数据, 1 ≤ ∣ s ∣ ≤ 30 1 \le \lvert s \rvert \le 30 1s30 1 ≤ s i ≤ 1000 1 \le s_i \le 1000 1si1000 s s s 所有子集元素之和 ≤ 10 18 \le {10}^{18} 1018

解法

这个题目是可以单纯通过找规律来获得公式的. 我们不妨从1个元素开始列举一下:

  • { 1 } \{1\} {1} 可以发现只有一个子集, 那么求和就是 1 × 1 1\times1 1×1
  • { 1 , 2 } \{1, 2\} {1,2} 可以列举一下, { 1 } \{1\} {1}, { 2 } \{2\} {2}, { 1 , 2 } \{1, 2\} {1,2}, 求和就是6, 可以发现元素出现的次数都是2, 也就可以转换为公式 { 2 × ( 1 + 2 ) } \{2\times(1 + 2)\} {2×(1+2)}
  • { 1 , 2 , 3 } \{1, 2, 3\} {1,2,3} 一样, 列举出来: { 1 } \{1\} {1}, { 2 } \{2\} {2}, { 3 } \{3\} {3}, { 1 , 2 } \{1, 2\} {1,2}, { 1 , 3 } \{1, 3\} {1,3}, { 2 , 3 } \{2, 3\} {2,3}, { 1 , 2 , 3 } \{1, 2, 3\} {1,2,3}, 发现刚好每个元素都出现了4次, 那么就可以转换为: { 4 × ( 1 + 2 + 3 ) } \{4 \times(1 + 2 + 3)\} {4×(1+2+3)}

如果你的数感好, 应该已经发现规律了:

  • 有1个元素的时候, 所有子集求和为1 * 所有元素的和
  • 有2个元素的时候, 所有子集求和为2 * 所有元素的和
  • 有3个元素的时候, 所有子集求和为4 * 所有元素的和
  • 有n个元素的时候, 所有子集求和为 2 n − 1 × s u m ( a r r a y ) 2^{n - 1} \times sum(array) 2n1×sum(array)

既然通项公式有了, 那么写为代码就很简单了:

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    long long a;
    stringstream ss(s);
    // 两个计数变量
    long long counter = 0;
    long long mySum = 0;
    while (ss >> a) {
        counter++;
        mySum += a;
    }
    cout << fixed << setprecision(0) << pow(2, counter - 1) * mySum << endl;
    return 0;
}

最后使用fixed << setprecision(0)是用来防止输出科学计数法的

使用long long来防止溢出

最后, 恭喜 AC !

在这里插入图片描述

### 回答1: Java 中可以使用 Stream API 和 Lambda 表达式来对 List 中的某个字段求和。 代码示例: ``` List<Person> people = ... int sum = people.stream() .mapToInt(p -> p.getAge()) .sum(); ``` 其中,Person 是实体类,getAge() 方法返回该实体类中 age 字段的值。 也可以使用 reduce 方法进行求和,下面是例子 ``` int sum = people.stream().map(Person::getAge).reduce(0, Integer::sum); ``` 通过这种方式,你可以很方便地对 List 中的某个字段求和。 ### 回答2: 在Java中,我们可以通过使用List集合和循环遍历的方式来实现对某个字段的求和操作。 首先,我们需要定义一个List集合来存储对象。假设我们有一个名为"students"的List集合,其中存储了多个学生对象,每个学生对象都有一个名为"score"的字段表示分数。 接下来,我们可以创建一个变量来保存求和结果,比如命名为"sum",并初始化为0。然后,我们可以使用for循环遍历整个List集合,对每个学生对象的分数进行累加操作。 具体的代码如下所示: ```java List<Student> students = new ArrayList<>(); // 学生列表 int sum = 0; // 分数的总和 for (Student student : students) { sum += student.getScore(); // 对每个学生的分数进行累加 } System.out.println("分数的总和为:" + sum); // 打印结果 ``` 需要注意的是,上述代码中的"Student"类是一个自定义类,其中包含了一个名为"score"的成员变量,以及相应的getter方法"getScore()"来获取分数值。在实际使用时,请替换为你所使用的对象和字段。 通过上述代码,我们就可以以很简洁的方式对List集合中的某个字段进行求和操作。 ### 回答3: 在Java中,可以使用List来存储一系列的对象。要通过某个字段对List中的元素进行求和,可以遵循以下步骤: 1. 创建一个变量用于存储求和的结果,初始化为0。 2. 遍历List中的每个元素。 3. 对于每个元素,访问它的某个字段的值,可以使用对象的getter方法或直接访问字段。 4. 将每个元素的字段值加到求和的结果中。 5. 遍历完所有元素后,求和的结果就是所需的值。 以下是用Java代码实现以上步骤的示例: ```java import java.util.List; public class Main { private static class Item { private int value; public Item(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { List<Item> items = List.of(new Item(1), new Item(2), new Item(3), new Item(4)); int sum = 0; for (Item item : items) { sum += item.getValue(); } System.out.println("求和结果: " + sum); } } ``` 在上述示例中,我们创建了一个Item类来表示列表中的每个元素,每个元素都有一个value字段。然后,我们使用List.of方法创建了一个包含4个Item对象的List。我们通过遍历List中的每个Item对象,并使用getValue方法获取每个Item的值,并将其累加到sum变量中。最终,我们打印sum的值,即为通过某个字段求和的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kaede清水枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值