【学习笔记】双向(折半)搜索 meet in the middle

双向搜索

怎么觉得我的博客没什么正经算法啊。

坑,待填。

P4799 [CEOI2015 Day2] 世界冰球锦标赛

Code

#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
const int MAXN = 45, MAXM = 1 << 21;
int n, mid, cnt_l, cnt_r;
LL m, ans;
LL ticket[MAXN] ,sum_l[MAXM], sum_r[MAXM];
void dfs(int l, int r, LL tot, LL *sum, int &cnt){
if(tot > m) return;
if(l > r){
sum[++cnt] = tot;
return;
}
dfs(l + 1, r, tot, sum, cnt);
dfs(l + 1, r, tot + ticket[l], sum, cnt);
}
inline LL read(){
LL x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return x * f;
}
int main(){
n = read(), m = read();
for(register int i = 1; i <= n; i++)
ticket[i] = read();
mid = n >> 1;
dfs(1, mid, 0, sum_l, cnt_l);
dfs(mid + 1, n, 0, sum_r, cnt_r);
sort(sum_l + 1, sum_l + 1 + cnt_l);
for(register int i = 1; i <= cnt_r; i++)
ans += upper_bound(sum_l + 1, sum_l + 1 + cnt_l, m - sum_r[i]) - sum_l - 1;
printf("%lld", ans);
return 0;
}
posted @   TSTYFST  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示