题解
2024-08-05 08:28:25
发布于:上海
16阅读
0回复
0点赞
这道题直接深搜即可
#include<limits>
#include<utility>
#include<iostream>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
typedef pair<ull,ull>ulp;
ulp hands[10];//pair类型数组,*.first表示左手,*.second表示右手
ull n,l,r,d=numeric_limits<ull>::max();//给d(差值)赋予 unsigned long long 上限
void dfs(int steps=0,ull l=1,ull r=0){//直接深搜,l和r分别表示左手和右手
//由于左手是乘积,所以需要从1开始乘
//由于右手是总和,所以需要从0开始加
if(steps==n){//这里是递归走到底的情况
if(l-1&&r)d=min(d,l>r?l-r:r-l);//判断是否是都有战力值了,否则不能算进去
return;
}
dfs(steps+1,l*(hands[steps].first),r+(hands[steps].second));//递归 选择这组战力值的情况
dfs(steps+1,l,r);//递归 不选择这组战力值的情况,也因此到底时需要判断是否为空
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>hands[i].first>>hands[i].second;//读入数据
dfs();//dfs开始搜索
cout<<d<<endl;
return 0;
}
深搜完成,时间复杂度 O(2n) 最坏情况为 O(210) = O(1024) ,确保不会TLE
这里空空如也
有帮助,赞一个