\(\color{#0066ff}{题目描述}\)

今年的世界冰球锦标赛在捷克举行。Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念。他只是单纯的想去看几场比赛。如果他有足够的钱,他会去看所有的比赛。不幸的是,他的财产十分有限,他决定把所有财产都用来买门票。

给出 Bobek 的预算和每场比赛的票价,试求:如果总票价不超过预算,他有多少种观赛方案。如果存在以其中一种方案观看某场比赛而另一种方案不观看,则认为这两种方案不同。

\(\color{#0066ff}{输入格式}\)

第一行,两个正整数 N 和 M(\(1 \leq N \leq 40,1 \leq M \leq 10^{18}\)),表示比赛的个数和 Bobek 那家徒四壁的财产。

第二行,N 个以空格分隔的正整数,均不超过 \(10^{16}\) ,代表每场比赛门票的价格。

\(\color{#0066ff}{输出格式}\)

输出一行,表示方案的个数。由于 N 十分大,注意:\(答案 \le 2^{40}\)

\(\color{#0066ff}{输入样例}\)

5 1000
100 1500 500 500 1000

\(\color{#0066ff}{输出样例}\)

8

\(\color{#0066ff}{题解}\)

meet in the middle 对抗搜索

\(O(2^{40}\to 2^{20}+2^{20}\to 2^{21})\)

合并中间量用upperbound

注意,不能用lowerbound,因为可能有相同价钱的方案,都要算上

#include<cstdio>
#include<queue>
#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cmath>
#define _ 0
#define LL long long
#define Space putchar(' ')
#define Enter putchar('\n')
#define fuu(x,y,z) for(int x=(y),x##end=z;x<=x##end;x++)
#define fu(x,y,z)  for(int x=(y),x##end=z;x<x##end;x++)
#define fdd(x,y,z) for(int x=(y),x##end=z;x>=x##end;x--)
#define fd(x,y,z)  for(int x=(y),x##end=z;x>x##end;x--)
#define mem(x,y)   memset(x,y,sizeof(x))
#ifndef olinr
inline char getc()
{static char buf[100001],*p1=buf,*p2=buf;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100001,stdin),p1==p2)? EOF:*p1++;
}
#else
#define getc() getchar()
#endif
template<typename T>inline void in(T &x)
{int f=1; char ch; x=0;while(!isdigit(ch=getc()))(ch=='-')&&(f=-f);while(isdigit(ch)) x=x*10+(ch^48),ch=getc();x*=f;
}
LL n,m;
LL a[1<<21],b[1<<21],s[50];
int num1,num2,mid;
LL ans;
inline void dfs1(int dep,LL tot)
{if(tot>m) return;if(dep==mid+1){a[++num1]=tot;return;}dfs1(dep+1,tot);dfs1(dep+1,tot+s[dep]);
}
inline void dfs2(int dep,LL tot)
{if(tot>m) return;if(dep==n+1){b[++num2]=tot;return;}dfs2(dep+1,tot);dfs2(dep+1,tot+s[dep]);
}
int main()
{in(n),in(m);fuu(i,1,n) in(s[i]);mid=(1+n)>>1;dfs1(1,0LL);dfs2(mid+1,0LL);std::sort(a+1,a+num1+1);fuu(i,1,num2) ans+=std::upper_bound(a+1,a+num1+1,m-b[i])-a-1;printf("%lld",ans);return ~~(0^_^0);
}

转载于:https://www.cnblogs.com/olinr/p/10060596.html

P4799 [CEOI2015 Day2]世界冰球锦标赛相关推荐

  1. 洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解

    洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解 题目链接:P4799 [CEOI2015 Day2] 世界冰球锦标赛 题意: 译自 CEOI2015 Day2 T1「Ice Ho ...

  2. 洛谷—P4799 [CEOI2015 Day2]世界冰球锦标赛题解

    题目链接:P4799 [CEOI2015 Day2]世界冰球锦标赛 题目大意: 给定钱数,问要多少种观赛方案,可以一场都不看. 题解思路: 这道题要用到一种搜索方法--折半搜索.具体方法为:我们先把数 ...

  3. 洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛

    题目链接:P4799 [CEOI2015 Day2] 世界冰球锦标赛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 折半搜索: 1:先搜索左半边的票价和 2:再搜索右半边的票价和 ...

  4. P4799 [CEOI2015 Day2]世界冰球锦标赛 (双端搜索)

    [CEOI2015 Day2]世界冰球锦标赛 - 洛谷 对于n<=40的情况,正常暴搜无疑要寄,那么我们可以分别从前一半和后一半开始搜,再对所搜的内容排序后,每一个在后面里二分出符合的答案. 和 ...

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

    知识点:双向搜索 这个是双向深搜,也是我的第一道双向搜索,所以挑了一个简单的题来写,还是比较简单的,以及要了解双向搜索是怎么降低时间复杂度的 #include <bits/stdc++.h> ...

  6. 洛谷P4799—— [CEOI2015 Day2]世界冰球锦标赛(折半搜索)

    原题链接 题意: 给n个物品和对应的价格,问用不超m元的钱可以买到的物品的方案数. 思路: 折半搜索的入门题(雾.jpg) n的范围是n<=40.普通的搜索一定会TLE,考虑将物品分成两部分来搜 ...

  7. P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)

    题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...

  8. P4799 [CEOI2015 Day2]世界冰球锦标赛(折半搜索)

    题目大意: 解题思路: 如果直接暴力(你的钱太多不允许你用背包),时间复杂度为O(240)O(2^{40})O(240)次方,但如果折半搜索可行的话,时间复杂度就为O(40∗220)O(40*2^{2 ...

  9. 【折半搜索】 洛谷 P4799 [CEOI2015 Day2]世界冰球锦标赛

    我只会看题解和抄题解 普通搜索在这道题中存在的问题 一共最多有40场比赛,每一场比赛有看和不看2种选择,如果求看40场比赛一共有多少选择,最多有2^40种可能性,时间复杂度太高. 折半搜索思路 1.把 ...

最新文章

  1. C++ 虚函数个人理解
  2. CSS小技巧——CSS滚动条美化
  3. 笔记本安装linux系统_Win10怎么安装linux双系统?win10安装linux双系统教程
  4. 11 linux suse 本地源_suse 11 Linux 静态路由的添加方法
  5. org.hibernate.InvalidMappingException: Could not parse mapping document from resource
  6. iBeacon 初探
  7. c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)
  8. php image 转 data uri 图片 (Image Data URIs with PHP)
  9. Rust: 如何交换Vec类型中数据的位置?
  10. 手机视频性能测试软件,视频性能检测工具——安兔兔视频测试
  11. 181225 Matlab图解峰度kurtosis与偏度skewness
  12. 【ME909】华为ME909 4G LTE模块在树莓派下通过minicom进行发送短信演示
  13. Poison Frogs! Targeted Clean-Label Poisoning Attacks on Neural Networks 论文阅读、复现及思考
  14. com.sun.mail.smtp.protected void rcptTo() 方法
  15. MySQL数据库被黑了
  16. JVM调优总结--压力测试
  17. [心得]让数据帮我说话
  18. axure流程图模式_手把手教你用AXURE绘制流程图的图文教程
  19. unity2D塔防游戏资源 Tower Defense 2D v1.3.1
  20. 固态硬盘无法识别,怎么办?4招教您解决!

热门文章

  1. 解数独 — Python
  2. 单位怎么发年终奖才能合理避税,用Python程序实现
  3. 计算机视觉:Opencv图像去畸变
  4. Jeston Nano国产主板使用注意事项
  5. 工信部将对大型、超大型数据中心全面节能监察,核算PUE实测值
  6. jsp-自定义标签Tag
  7. Doxygen + Graphviz windows+Windows Help Workshop下安装配置(图解)
  8. nginx 访问日志
  9. IE浏览器对ArcMap和ArcGIS Pro的一些影响
  10. 【期望DP+优化】路哥