- 国贸周五19:30摸底赛 II
划分子集(折半搜索示例代码)
- @ 2026-4-24 21:25:45
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[50],n,ans=0,mid;
int suml[1050000],sumr[1050000],cntl=0,cntr=0;
void dfsl(int k,int s){
//k代表目前正在决策第k个数,决策到第k个数的和为s
if(k>mid){
suml[++cntl] = s;//把合理的方案存到左数组
return ;
}
dfsl(k+1 , s+a[k]);
dfsl(k+1 , s);
}
void dfsr(int k,int s){
//k代表目前正在决策第k个数,决策到第k个数的和为s
if(k>n){
sumr[++cntr] = s;//把合理的方案存到右数组
return ;
}
dfsr(k+1 , s+a[k]);
dfsr(k+1 , s);
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
mid = n/2;//1 ~ mid mid+1 ~ n
dfsl(1,0);//先对第一个数进行决策,和为0
dfsr(mid+1,0);//右边是先对第mid+1个数进行决策,和为0
sort(sumr+1,sumr+1+cntr);
for(int i=1;i<=cntl;i++){
int pos = upper_bound(sumr+1,sumr+1+cntr,-suml[i]) - sumr;
ans += cntr-pos+1;
}
cout << ans;
//折半深搜
return 0;
}
1 条评论
-
黄天骐 LV 7 @ 2026-4-24 21:27:04
太ne了
- 1