Description

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

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

Input

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

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

Output

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

显然这个题直接dfs是过不去的\(O(2^n)\)

但是我们可以一半一半的搜,即折半搜索,复杂度可以降到\(O(2^{\frac{n}{2}})\)

所以我们取一个\(mid\),分别搜前半段和后半段。

然后合并答案的时候就需要令某一个数组变得有序,在其中找到最靠右的合法位置,直接累加即可。

这里用到了\(upper\)_\(bound\)

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register
#define lo long longusing namespace std;const int gz=1e6+6e5;inline void in(R lo &x)
{R int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f;
}lo a[gz],b[gz],mon[42],ans,m;int sum,cnt,n,mid;void dfs(R int dep,R lo now)
{if(now>m)return;if(dep>mid){a[++cnt]=now;return;}dfs(dep+1,now+mon[dep]);dfs(dep+1,now);
}void dfss(R int dep,R lo now)
{if(now>m)return;if(dep>n){b[++sum]=now;return;}dfss(dep+1,now+mon[dep]);dfss(dep+1,now);
}int main()
{scanf("%d%lld",&n,&m);for(R int i=1;i<=n;i++)in(mon[i]);mid=(n+1)/2;dfs(1,0);dfss(mid+1,0);sort(b+1,b+sum+1);for(R int i=1;i<=cnt;i++)ans+=upper_bound(b+1,b+sum+1,m-a[i])-b-1;printf("%lld",ans);
}

转载于:https://www.cnblogs.com/-guz/p/10013242.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]世界冰球锦标赛

    \(\color{#0066ff}{题目描述}\) 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 如何发布ActiveX 控件
  2. 《JAVA练习题目7》 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数。(类PrimeGenerator都由类Main代替)
  3. JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置
  4. PHP设计模式之适配器模式
  5. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
  6. 从医院到家,再重返SAP成都研究院
  7. switch字符串jdk_从JDK 12删除原始字符串文字
  8. NET Framework 4.0 安装失败:安装时发生严重错误
  9. 把iconfront的资源放cdn访问_详解mpvue小程序中怎么引入iconfont字体图标
  10. 你说,Redis如何实现键值自动清理?
  11. java 军工_为什么军工行业不用java而是选择继续用c(对于业务系统Java是非常合适的而不带操作系统的板子甚至可以做到微秒级别的实时控制)...
  12. Go 用JSON加载表格数据
  13. 再谈关于IP数据报分片
  14. MySQL Workbench 如何连接 Amazon EC2 上的MySQL服务器?
  15. Log4J发日志邮件给多个接收者及标题、正文乱码问题
  16. 折腾凤凰系统 (by quqi99)
  17. 人体存在雷达传感器,毫米波雷达技术探测应用,智能感知静态人体存在
  18. Android Netd ndc
  19. 【java】企业微信机器人消息推送
  20. 如果不是生活所迫,谁愿意把自己搞的才华横溢

热门文章

  1. 芝村乡个人小额投资理财的正确观念
  2. 神经网络控制系统的应用,神经网络控制基本原理
  3. 如何获得云盘服务器,云服务器如何增加云盘
  4. 孩子,未来你所需要的职业素养,《中国机长》都告诉你了
  5. Android 实时采集声音的频率和大小
  6. 多分类条件下分类指标:Macro-average和Micro-average,以及Weighted-average
  7. Excel实现数据转置,很方便操作
  8. c++ vector 一部分_乔治娜怼黑粉!嫉妒不会使人进步,我和C罗都完成蜕变,感觉很棒|乔治娜|c罗|王子|布里斯托尔|意大利...
  9. 几款市面上的网管软件比较
  10. Learning Log:输入一个天数,计算天数包含多少周和剩余的天数