侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 26 条评论

目 录CONTENT

文章目录

【枚举】砝码称重【蓝桥杯】

GabrielxD
2022-12-29 / 0 评论 / 0 点赞 / 188 阅读 / 629 字
温馨提示:
本文最后更新于 2022-12-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

砝码称重 - 蓝桥云课


你有一架天平和 NN 个砝码,这 NN 个砝码重量依次是 W1,W2,,WNW_1, W_2, · · · , W_N

请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 NN

第二行包含 NN 个整数:W1,W2,W3,,WNW_1, W_2, W_3, · · · , W_N

输出格式

输出一个整数代表答案。

样例输入

3
1 4 6

样例输出

10

样例说明

能称出的 1010 种重量是:1234567910111、2、3、4、5、6、7、9、10、11

1=11 = 1

2=642 = 6 − 4 (天平一边放 66,另一边放 44);

3=413 = 4 − 1

4=44 = 4

5=615 = 6 − 1

6=66 = 6

7=1+67 = 1 + 6

9=4+619 = 4 + 6 − 1

10=4+610 = 4 + 6

11=1+4+611 = 1 + 4 + 6

评测用例规模与约定

对于 50%50\% 的评测用例,1N151 ≤ N ≤ 15

对于所有评测用例,1N1001 ≤ N ≤ 100NN 个砝码总重不超过 100000100000

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

解题

方法一:枚举

思路

每多一种砝码就与之前能称出的所有重量做和或做差,得到新的能称出的重量。

注意:

  • 遍历过程中如果修改原集合会引发并发修改异常,所以要建一个新的集合存新重量,遍历完成后再合并集合。
  • 重量 00 不能被称出,要特判。

代码

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int n = (int) in.nval;
        Set<Integer> ans = new HashSet<>();
        while (n-- > 0) {
            in.nextToken();
            int x = (int) in.nval;
            Set<Integer> st = new HashSet<>();
            for (int y : ans) {
                st.add(x + y);
                st.add(Math.abs(x - y));
            }
            ans.add(x);
            ans.addAll(st);
        }
        System.out.println(ans.size() - (ans.contains(0) ? 1 : 0));
    }
}
0

评论区