抽签问题

时间:4.28

本次学习记录来源于《挑战程序设计竞赛(第2版)》

抽签问题

题目描述:
你的朋友提议玩一个游戏:将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4个数字的和是m,就是你赢,否则就是你的朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋,取出所有纸片,检查自己是否真的有赢的可能性。请你编写一个程序,判断当纸片上所写的数字是k,k2,…, k,时,是否存在抽取4次和为m的方案。如果存在,输出 Yes;否则,输出 No。

限制条件:
1 ≤ n ≤ 50
1 ≤ m ≤ 10^8
1≤ ki ≤10^8

题目分析:
这题的常规想法肯定是用四个for循环来写,但是很显然这样行不通,指数时间在数据大的时候定会超时。这个时候就要优化一下算法。
首先想到的一点是改进搜索方法,把常规的顺序搜索改为二分搜索这样就会大大提升效率。
其次是优化内层循环呀,这个四层循环简直是累死人啊,所以最内层的循环可以采用一种巧妙的方法来替换掉。
还可以继续改进,把最后两层循环都改进一下,构建一个数据枚举前两次循环的两数之和,用以作为最后一层循环的判断条件。以达到最优的效果。

参考代码:

//未优化前,时间复杂度O(n^4)
#include<bits/stdc++.h>
using namespace std;int main() {int n, m;cin >> n >> m;int a[n];for (int i = 0; i < n; i++) {cin >> a[i];}bool flag = false;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {for (int l = 0; l < n; l++) {if (a[i] + a[j] + a[k] + a[l] == m) {flag = true;}}}}}if (flag) {cout << "Yes" << endl;}else {cout << "No" << endl;}return 0;
}
//优化一次后,时间复杂度O(n^3logn)
#include<bits/stdc++.h>
using namespace std;bool binary_search(int a[], int n, int x) {int l = 0, r = n - 1;sort(a, a + n);while (l <= r) {int mid = (l + r) / 2;if (a[mid] == x) {return true;}else if (a[mid] < x) {l = mid + 1;}else {r = mid - 1;}}return false;
}int main() {int n, m;cin >> n >> m;int a[n];for (int i = 0; i < n; i++) {cin >> a[i];}bool flag = false;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {//这个条件就是通过判断等式移项而来,这样就省去了一层循环if (binary_search(a, n, m - a[i] - a[j] - a[k])) {flag = true;}}}}if (flag) {cout << "Yes" << endl;}else {cout << "No" << endl;}return 0;
}
//第三次优化循环,使时间复杂度缩减到了O(n^2logn)
#include<bits/stdc++.h>
using namespace std;bool binary_search(int aa[], int n, int x) {int l = 0, r = n - 1;while (l <= r) {int mid = (l + r) / 2;if (aa[mid] == x) {return true;}else if (aa[mid] < x) {l = mid + 1;}else {r = mid - 1;}}return false;
}int main() {int n, m;cin >> n >> m;int a[n];int aa[n * n];  //保存两个数的和的数列for (int i = 0; i < n; i++) {cin >> a[i];}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {aa[i * n + j] = a[i] + a[j];}}sort(aa, aa + n * n);bool flag = false;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (binary_search(aa, n * n, m - a[i] - a[j])) {flag = true;}}}if (flag) {cout << "Yes" << endl;}else {cout << "No" << endl;}return 0;
}

本次刷题心得:
温习了一遍二分搜索,还学会了两个优化小技巧,通过把判断等式移项来获得一个新的判断条件,另一个是,可以通过构建一个数组来储存两次循环的结果,以此来代替循环真的是妙啊。

抽签问题(算法例题讲解)相关推荐

  1. 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)

    Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...

  2. 微课|中学生可以这样学Python(8.1节):解析算法例题讲解

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第8章  常用算法的Python实现 8.1  解析算法案例分析 京东购买链接:https://i ...

  3. 银行家算法例题讲解_银行家算法

    死锁常见的题目 定义 所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面.死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用, ...

  4. 佩尔方程(超详细推导+例题讲解) 每日一遍,算法再见!

    这里写目录标题 佩尔方程 第一类佩尔方程 第一类佩尔方程例题讲解 第二类佩尔方程 佩尔方程 第一类佩尔方程 定义:形如x2−dy2=1x^2 - dy^2 = 1x2−dy2=1(d>1,且d不 ...

  5. 国考省考行测:继续讲结构分析法的分总、总分、分分、分总分、总分总的真题例题讲解,错项的特点规律

    国考省考行测:继续讲结构分析法的分总.总分.分分.分总分.总分总的真题例题讲解,错项的特点规律 2022找工作是学历.能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省 ...

  6. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  7. 计算机算法的发展动态,计算机算法动态规划讲解.ppt

    计算机算法动态规划讲解 * 0-1背包问题 设所给0-1背包问题的子问题 的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,-,n时0-1背包问题的最优值.由0-1背包问题 ...

  8. 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 京东图书地址:https://item.jd.com/12571990.html 当当图书地址:h ...

  9. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-10  把十进制数转换为其他进制形式. 例4-11  验证6174猜想. 例4-12.例4- ...

最新文章

  1. 2022-2028年中国铁路机车行业投资分析及前景预测报告
  2. 基于Python, Selenium, Phantomjs无头浏览器访问页面
  3. 登录加密的前后端测试
  4. Leetcode 17. Letter Combinations of a Phone Number(python)
  5. 选取文档元素的API
  6. c语言模拟试卷答案,C语言模拟试卷及其答案
  7. Ubuntu20.04搭建ftp服务(亲测通过)
  8. Python中的具名元组类用法
  9. 绕过PDF阅读编辑要VIP才能无水印保存的方法
  10. cass等距离等分线段的命令键_CAD等分线段指令是什么?
  11. java 开发中相对路径的参照物是什么,参照路径的配置,以及相对路径前加不加(/)反斜杠区别
  12. Java多线程面试题:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次
  13. AES算法中S盒的FPGA实现
  14. 阿里云快照如何恢复到另外一台服务器
  15. 【已解决】阿里自动滑块 x5sec 解密 钉钉数据采集
  16. 刷完leetcode的二叉树中等题,请允许我小小的嘚瑟一把
  17. 冷漠 有时候并不是无情:QQ日志分享
  18. 毕业工作5年被裁,那些进了大厂的程序员面试前都做了哪些准备?附赠课程+题库
  19. win11更改系统字体的方法
  20. 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

热门文章

  1. [UE4]游戏中服务器切换地图,控制台命令Execute console Command
  2. C语言 while语句
  3. 腾讯副总裁姚星:中国AI有更大梦想,每次浪潮腾讯都在革自己的命
  4. 组合逻辑竞争冒险,时序逻辑亚稳态【0型冒险】【1型冒险】【消除方法】【数字IC笔试】【数字电路】
  5. 求数的最大值(重载)
  6. 复现SCI论文图表:棒棒糖图|渐变|legeng设置
  7. html5description标签,HTML中Meta标签的Keywords和Description独特见解
  8. getrand在c语言中的作用,c语言 rand 的用法
  9. 开源网安与航天网信达成战略合作,共建大湾区城市供应链平台
  10. 180万大奖,优先锁定高薪Offer,2020科大讯飞A.I.开发者大赛邀你挑战!