3 条题解
-
1
#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; }
代码解释如下:
- 声明并初始化两个大小为15的整数数组
a
和b
,以及两个整数变量n
和ans
。n
用于存储将要输入的数字对的数量,ans
用于存储乘积和与和之间的最小绝对差值,初始化为一个较大的值(999999)。 - 通过
cin
从标准输入读取n
的值。 - 使用一个
for
循环读取n
对整数,并将它们分别存储在数组a
和b
中。 - 另一个
for
循环用于遍历a
和b
数组的所有可能子集组合。这个循环使用了位运算来生成所有可能的组合。具体来说,i
从1遍历到2^n - 1
,其中i
的二进制表示决定了哪些元素被包括在当前的子集中(如果i
的二进制表示的第j
位是1,则第j+1
对数字被包括在子集中)。 - 对于每个子集组合,计算
a
数组中元素的乘积(sum1
)和b
数组中元素的和(sum2
)。如果i
的二进制表示的第j
位是1,则a[j+1]
被乘到sum1
上,b[j+1]
被加到sum2
上。 - 计算当前组合的乘积和与和之间的差值的绝对值,即
abs(sum1 - sum2)
,并与当前的最小值ans
比较。如果新的差值更小,则更新ans
。 - 遍历完所有可能的组合后,输出最小差值
ans
。
- 声明并初始化两个大小为15的整数数组
-
0
#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
#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
- 上传者