[CEOI2015 Day2]世界冰球锦标赛 (双向搜索)
题目描述
[CEOI2015 Day2]世界冰球锦标赛译自 CEOI2015 Day2 T1「Ice Hockey World Championship」
今年的世界冰球锦标赛在捷克举行。Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念。他只是单纯的想去看几场比赛。如果他有足够的钱,他会去看所有的比赛。不幸的是,他的财产十分有限,他决定把所有财产都用来买门票。
给出 Bobek 的预算和每场比赛的票价,试求:如果总票价不超过预算,他有多少种观赛方案。如果存在以其中一种方案观看某场比赛而另一种方案不观看,则认为这两种方案不同。
输入格式:
第一行,两个正整数 N 和 $ M(1 \leq N \leq 40,1 \leq M \leq 10{18})M(1≤N≤40,1≤M≤10{18}) $ ,表示比赛的个数和 Bobek 那家徒四壁的财产。
第二行,N 个以空格分隔的正整数,均不超过 $ 10{16}1016 $ ,代表每场比赛门票的价格。
输出格式:
输出一行,表示方案的个数。由于 NN 十分大,注意:答案 $ \le 2{40}≤2{40} $ 。
输入样例:
5 1000
100 1500 500 500 1000
输出样例1:
8
说明
样例解释:八种方案分别是:
一场都不看,溜了溜了
价格 100 的比赛
第一场价格 500 的比赛
第二场价格 500 的比赛
价格 100 的比赛和第一场价格 500 的比赛
价格 100 的比赛和第二场价格 500 的比赛
两场价格 500 的比赛
价格 1000 的比赛
solution:
非常经典的双向搜索,先枚举前20场比赛看不看,将所有方案会花的钱的数目存入数组中,再枚举后20场比赛看不看,将结果存入第二个数组中。将第二个数组排个序,遍历第一个数组,二分找到每一个元素在二号数组中能匹配的最大下标,然后直接加到ans中去即可。
=>
code:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int n,midd;
ll a[41],m,ans,t1,t2;
ll l[1200001];
ll r[1200001];
inline ll qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
ll res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
inline void dfs1(int t,ll tot){
if(t==midd){
l[++t1]=tot;
return ;
}dfs1(t+1,tot);
if(tot+a[t]<=m)
dfs1(t+1,tot+a[t]);
}
inline void dfs2(int t,ll tot){
if(t>n){
r[++t2]=tot;
return ;
}dfs2(t+1,tot);
if(tot+a[t]<=m)
dfs2(t+1,tot+a[t]);
}
inline int get(ll t){
int x=1,y=t2,mid;
while(x<=y){
mid=(x+y)>>1;
if(t<r[mid])y=mid-1;
else x=mid+1;
}return y;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(),m=qr();midd=n/2+1;
for(rg i=1;i<=n;++i)
a[i]=qr();
dfs1(1,0); dfs2(midd,0);
sort(r+1,r+t2+1);
for(rg i=1;i<=t1;++i)
ans+=get(m-l[i]);
printf("%lld\n",ans);
return 0;
}
[CEOI2015 Day2]世界冰球锦标赛 (双向搜索)的更多相关文章
- 题解 P4799 【[CEOI2015 Day2]世界冰球锦标赛】
题解 P4799 [[CEOI2015 Day2]世界冰球锦标赛] 双向搜索好题 传送门 实际上,双向搜索就是把\(a^n\)的复杂度转变成了大多为\(O(nlogna^{\frac{n}{2}})\ ...
- 【BZOJ4800】[CEOI2015 Day2]世界冰球锦标赛 (折半搜索)
[CEOI2015 Day2]世界冰球锦标赛 题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.\(Bob ...
- 【题解】P4799[CEOI2015 Day2]世界冰球锦标赛
[题解][P4799 CEOI2015 Day2]世界冰球锦标赛 发现买票顺序和答案无关,又发现\(n\le40\),又发现从后面往前面买可以通过\(M\)来和从前面往后面买的方案进行联系.可以知道是 ...
- 折半搜索【p4799】[CEOI2015 Day2]世界冰球锦标赛
Description 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会去看所有的比赛.不幸的是,他 ...
- P4799 [CEOI2015 Day2]世界冰球锦标赛
\(\color{#0066ff}{题目描述}\) 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会 ...
- [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)
传送门 Solution 折半搜索裸题,注意\(long long\) Code #include <cmath> #include <cstdio> #include < ...
- P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)
题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...
- 洛谷P4799 世界冰球锦标赛 CEOI2015 Day2 meet-in-the-middle
正解:折半搜索 解题报告: 先放个传送门QAQ 想先说下部分分?因为包含了搜索背包两个方面就觉得顺便复习下?QwQ 第一档部分分 爆搜 就最最普通的爆搜鸭,dfs(第几场,钱),然后每次可以看可以不看 ...
- [题解](折半搜索)luogu_P4799_BZOJ_4800世界冰球锦标赛
抄的题解 以及参考:https://www.cnblogs.com/ZAGER/p/9827160.html 2^40爆搜过不了,考虑折半搜索,难点在于合并左右的答案,因为有可能答案同时载左右两边,我 ...
随机推荐
- [T-ARA][Tic Tic Toc]
歌词来源:http://music.163.com/#/song?id=22704478 Tic Tic Toc RA Tic Tic Toc RA [Tic Tic Toc RA Tic Tic T ...
- VSCode和VUE的初始安装及简单使用入门
(版本1.0) npm run dev 运行工程 PS F:\SDN\VIMS--前端\vue> cnpm install PS F:\SDN\VIMS--前端\vue> cnpm reb ...
- bootstrap响应式布局列子
<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...
- js 判断是否选中
js的方法 window.onload = function(){ var oDiv = document.getElementById('div1'); alert(oDiv.checked) } ...
- 深入解读Quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1 ...
- vue 使用element-ui upload文件上传之后怎么清空
首先上传组件中一定要绑定这两个属性: ref,和 :file-list,如果没有ref,即使 用 this.$refs.upload.clearFiles()也不行,因为这时候this.$refs为空 ...
- Spring之使用表达式配置切入点
使用表达式配置切入点
- Java之数据流-复制二进制文件
package test_demo.fileoper; import java.io.*; /* * 数值字节流操作,复制二进制文件 * 输入流:从文件中读取数据,扩展为数据流(二进制) * 输出流: ...
- springsecurity实战
springsecurity是一种安全性框架,主要用于进行权限验证,下面是其基本使用方法: pom.xml <dependency> <groupId>org.springfr ...
- King's Quest POJ - 1904(强连通分量)
建图:王子u喜欢女孩v,则u到v连一条边.对于给出的初始完美匹配,王子u与女孩v匹配,则v到u连一条边.然后求SCC. 显然对于同一个SCC中王子数目和女孩数目是相等的,并且从某个王子出发能够到达所有 ...