3 条题解

  • 1
    @ 2024-2-24 13:37:47
    #include <iostream>
    using namespace std;
    int a[15],b[15],n,ans=1145145;
    int main ()
    {
        cin>>n;
        for (int i=1;i<=n;i++)
        {
            cin>>a[i]>>b[i];
        }
    
        for (int i=1;i<(1<<n);i++)
        {
             int sum1=1;
             int sum2=0;
             for (int j=0;j<n;j++)
            {
                if(i&(1<<j))
                {
                    sum1*=a[j+1];
                    sum2+=b[j+1];
                }
            }
            ans=min(ans,abs(sum1-sum2));
        }
            cout<<ans;
            return 0;
    }
    

    代码解释如下:

    1. 声明并初始化两个大小为15的整数数组ab,以及两个整数变量nansn用于存储将要输入的数字对的数量,ans用于存储乘积和与和之间的最小绝对差值,初始化为一个较大的值(999999)。
    2. 通过cin从标准输入读取n的值。
    3. 使用一个for循环读取n对整数,并将它们分别存储在数组ab中。
    4. 另一个for循环用于遍历ab数组的所有可能子集组合。这个循环使用了位运算来生成所有可能的组合。具体来说,i从1遍历到2^n - 1,其中i的二进制表示决定了哪些元素被包括在当前的子集中(如果i的二进制表示的第j位是1,则第j+1对数字被包括在子集中)。
    5. 对于每个子集组合,计算a数组中元素的乘积(sum1)和b数组中元素的和(sum2)。如果i的二进制表示的第j位是1,则a[j+1]被乘到sum1上,b[j+1]被加到sum2上。
    6. 计算当前组合的乘积和与和之间的差值的绝对值,即abs(sum1 - sum2),并与当前的最小值ans比较。如果新的差值更小,则更新ans
    7. 遍历完所有可能的组合后,输出最小差值ans
    • 0
      @ 2023-12-15 22:42:45
      #include <bits/stdc++.h>
      using namespace std;
      int n,a[15],b[15],ans=INT_MAX;
      int main(){
          cin>>n;
          for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
          for(int i=1;i<(1<<n);i++){
              int suma=1,sumb=0;
              for(int j=0;j<n;j++)
                  if(i&(1<<j))suma*=a[j+1],sumb+=b[j+1];
              ans=min(ans,abs(suma-sumb));
          }
          cout<<ans;
          return 0;}
      
      • -1
        @ 2023-12-17 17:45:49
        #include<bits/stdc++.h>
        int n,a[11],b[11],ans=2147483647;
        int main()
        {
            std::cin>>n;
            for(int i=1;i<=n;i+=1)std::cin>>a[i]>>b[i];
            for(int i=1;i<(1<<n);i+=1)
            {
                int sum1=1,sum2=0;
                for(int j=0;j<n;j+=1)if(i&(1<<j))
                {
                    sum1*=a[j+1];
                    sum2+=b[j+1];
                }
                ans=std::min(ans,abs(sum1-sum2));
          }
            std::cout<<ans;
        }
        
        • 1

        信息

        ID
        611
        时间
        1000ms
        内存
        256MiB
        难度
        5
        标签
        递交数
        279
        已通过
        101
        上传者