蓝桥杯砝码称重

蓝桥杯砝码称重_第1张图片

蓝桥杯砝码称重_第2张图片

以下是完整的代码:

#include 
#include 
#include 
using namespace std;
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    set s={0};
    int n,m,i;
    cin>>n;
    for(i=0;i>m;
        vector v(s.begin(),s.end());
        for(int &e:v)
        {
            s.insert(e+m);
            s.insert(abs(e-m));
        }
    }
    cout<

代码整体结构

  • 代码使用了 set 数据结构来存储所有可能的结果。set 自动去重且支持高效查找,适合用于存储不重复的结果。
  • 程序的输入是一个整数序列,通过逐步操作来生成所有可能的数值。

代码详细解析

(1) 基本设置
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);

这三行代码是输入输出优化的常用设置:

  • ios::sync_with_stdio(false):关闭 C++ 标准流与 C 标准流的同步,提高输入输出效率。
  • cin.tie(0):解除 cincout 的绑定,使输入输出操作更加独立,提高效率。
  • cout.tie(0):类似于 cin.tie(0)

(2) 初始化和输入

set s = {0};
int n, m, i;
cin >> n;
  • set s = {0}:初始化一个 set,初始值为 0,表示当前只有一个结果:0。
  • cin >> n:读取整数 nnn,表示接下来有 nnn 个整数作为输入。

(3) 核心逻辑:生成所有可能的结果

for (i = 0; i < n; ++i)
{
    cin >> m;  // 读取一个整数 m
    vector v(s.begin(), s.end());  // 将当前的 set 内容复制到 vector 中
    for (int &e : v)
    {
        s.insert(e + m);       // 插入当前数与 m 的加法结果
        s.insert(abs(e - m));  // 插入当前数与 m 的绝对值减法结果
    }
}
  • 外层循环:遍历所有输入的 nnn 个整数。
    • 每次读取一个整数 mmm,并将当前 set 的内容复制到一个临时的 vector 中(set 的迭代器是只读的,不能直接在遍历时修改)。
  • 内层循环:遍历当前的所有结果(保存在 vector 中)。
    • e + m:将每个已有结果与当前数 mmm 相加,结果插入到 set 中。
    • abs(e - m):将每个已有结果与当前数 mmm 相减的绝对值,结果插入到 set 中。
  • 通过这两种操作(加法和绝对值减法),可以生成新的结果。

(4) 计算最终结果

cout << s.size() - 1;
  • s.size():计算 set 中元素的个数,表示所有可能的结果的数量。
  • 减去 1:由于 set 初始化时包含了一个值 0,而题目可能要求排除这个初始值,所以输出结果需要减 1。

你可能感兴趣的:(蓝桥杯,java,算法)