前言

本来是在做搜索剪枝题单的倒数第二题,发现不会做,看了看题解里大佬说这一题更容易,于是打算先从简单入手。

自己YY了个做法,推了推复杂度,好像能过,码了码交上去WA一片,仔细观察了一下发现是二分之前忘记排序了……排序后交上去果然过了。

AC之后片刻,突然意识到自己像个sb:为什么不用upper_bound()呢?


题目描述

题目链接:洛谷P4799 世界冰球锦标赛.

大意是,有nnn个数,还有一个数mmm,求nnn个数任选若干数的和不超过mmm的方案数有多少。

例如:

 n = 5, m = 1000a[] = 100 1500 500 500 1000

一共有888种方案。


题目分析

观察到nnn只有40,于是我们先考虑暴力。

枚举每一个数 选 or 不选,在dfs的过程中记录当前已选数的和,最后判断是否小于mmm,复杂度O(2n)O(2^n)O(2n).

可是这个nnn有40啊,要是能让nnn减半该多好。

于是这么思考了起来:将nnn个数分成前n/2n/2n/2个数与后n/2n/2n/2个数两部分,对前半部分枚举每一个数 选 or 不选,每种方案所选数的和放入s1[]s1[]s1[];对后半部分进行同样的操作,将每种方案所选数的和存入s2[]s2[]s2[]。对于s1[]s1[]s1[]中的一个和aaa,s2[]s2[]s2[]中所有小于等于m−am-am−a的方案都是可行的。

于是只需要对枚举s1[]s1[]s1[]中的每一个aaa,计算s2[]s2[]s2[]中小于等于m−am-am−a的数有多少个,那么答案就加多少。这里可以对s2[]s2[]s2[]排序之后,进行二分查找,总复杂度O(2n2log(2n2))=O(n2n2)O(2^\frac{n}{2}log(2^\frac{n}{2}))=O(n2^\frac{n}{2})O(22n​log(22n​))=O(n22n​),可以过掉。

我忘了有个upper_bound()于是手写的二分,不得不说要注意的细节还是有一些的。


示例代码

  • 手写二分:

vector<int> s[2]; //s[0]与s[1]分别对应上文说的s1与s2
int bi_search(LL v){int l, r, mid;l = 0;   r = (int)s[1].size()-1;if(r == -1)   return 0;   //这句不要也行,可以想想为什么while(l < r){ // 最后l与r指向第一个大于v的数mid = (l+r) >> 1;if(s[1][mid] <= v)l = mid+1;else   r = mid;}if(l==(int)s[1].size()-1 && v>=s[1][l])//特判v比最大值的情况++ l;return l;
}
  • upper_bound()二分 (秒杀)
int pos = upper_bound(s[1].begin(), s[1].end(), m-s[0][i]) - s[1].begin() //太简单了点hhh
  • 完整代码
#include<bits/stdc++.h>
using namespace std;typedef long long LL;int n, ed[2]; //ed[0]:前半段的结束位置    ed[1]:后半段的结束位置
LL m, Ans;
LL a[45];
vector<LL> s[2];// 文中的s1、s2void dfs(int now, int tp, LL sum){//now:当前为a[now],  tp:0:前半段/1:后半段,  sum:当前已选数的和if(sum > m) return; //小剪枝if(now > ed[tp]){ // 枚举完这半段s[tp].push_back(sum);return;}dfs(now+1, tp, sum+a[now]); //选dfs(now+1, tp, sum); //不选
}int main(){cin >> n >> m;for(int i=1; i<=n; ++i)cin >> a[i];ed[0] = n/2;     ed[1] = n; //前半段和后半段的结束位置分别为n/2 与 ndfs(1, 0, 0);   dfs(n/2+1, 1, 0);sort(s[1].begin(), s[1].end()); // 二分前千万不要忘了排序!int l = s[0].size();for(int i=0; i<l; ++i){int pos = upper_bound(s[1].begin(), s[1].end(), m-s[0][i]) - s[1].begin(); // 二分Ans += pos;}printf("%lld", Ans);return 0;
}

后记

二分前忘记排序,忘记upper_bound()这些小失误依旧存在,不过能够明显感觉自己码力变强了不少,以前碰到这样的题可能思考都不会思考,写个暴力就走人了,现在能够进一步的有新的想法,还是对自己很有期待的。

继续加油!

洛谷P4799 世界冰球锦标赛 搜索+二分相关推荐

  1. 洛谷P4799 世界冰球锦标赛

    题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有 ...

  2. 洛谷P4799 世界冰球锦标赛 折半搜索

    给出n≤40n\leq40n≤40个比赛,给出每个比赛的票价以及M≤1e18M\leq1e18M≤1e18表示你的积蓄.然后求问能看的比赛的方案数是多少. nnn如果能够再小一些就可以直接暴搜了,但是 ...

  3. 洛谷P4799 世界冰球锦标赛 CEOI2015 Day2 meet-in-the-middle

    正解:折半搜索 解题报告: 先放个传送门QAQ 想先说下部分分?因为包含了搜索背包两个方面就觉得顺便复习下?QwQ 第一档部分分 爆搜 就最最普通的爆搜鸭,dfs(第几场,钱),然后每次可以看可以不看 ...

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

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

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

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

  6. 【洛谷 4799】 世界冰球锦标赛 Meet in the Middle 折半搜索

    题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有 ...

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

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

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

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

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

    Description 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会去看所有的比赛.不幸的是,他 ...

最新文章

  1. VMware Workstation下新建用户及Linux常用操作命令
  2. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码
  3. oracle数据库dba密码,Oracle数据库的找回DBA账户的密码
  4. 30美丽的矢量建筑艺术为灵感
  5. 日本电影《摇摆》:男人之间的心灵碰撞
  6. 值类型 引用类型 堆栈 堆 之 异想
  7. 在ASP.NET Core中创建自定义端点可视化图
  8. python中遇到的问题_python中遇到的一些问题及解决方案
  9. 为什么退休后,有人领的叫退休金,而有人领的叫养老金?两者有什么区别吗?
  10. 学生机房虚拟化(六)使用Clonezilla克隆Linux系统
  11. 贯入用计算机怎样换算,标准贯入试验的应用及其杆径换算的研究.doc
  12. 阅读笔记(Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks)
  13. 台达DOP系列触摸屏与电脑通讯不上时,如何进入系统设置画面修改系统设置从而正常通讯?
  14. 58 同城 iOS 客户端 Hybrid 框架探索
  15. tEST 1 for NOIP 2017.9.9.
  16. live writer实用插件合集
  17. [英语阅读]经济不景气金融从业者外遇增多
  18. 4.单片机之静态数码管和动态数码管
  19. 远程教育(电大)网考统考计算机应,4月电大远程网络教育计算机应用基础统考题库真题3...
  20. 科学家在类脑芯片上实现类似LSTM的功能,能效高1000倍

热门文章

  1. 在android中替换整个相机管道
  2. 上海2017QCon个人分享总结
  3. CentOS7 安装Tenda U12无线网卡驱动
  4. java静态方法的调用方法_Java静态方法和实例方法
  5. 由一张血管图片引发的算法分析(二)
  6. 华尔街股神胡立阳:奥运前出逃A股肯定后悔
  7. php 10天自动确认收货,修正Ecshop的recieve.php邮件自动确认收货BUG
  8. 局域网中,IP冲突怎么解决,思路陈列
  9. 硅谷 AI 之王 Sam Altman : 如何通过创业取得成功 | How to Succeed with a Startup
  10. (ssl 1346)电车#spfa#