【题目描述】:

将写有数字的n个纸片放入口袋,抽取四次,每次抽取后记下数字后放回纸片,判断这四个数字和是否有可能为m?

限制条件:

1<=n<=50

1<=m<=10(8)

1<=ki<=10(8)

【分析】:

因为是 4张,且是又放回抽取,假设数字是a,b,c,d;

因此前两次抽取的值的和的有可能的情况(a+b) 和 后两者抽取的值的和的情况(c+d)是一样的,那么做题思路就出来了:

先用一个二维数组记录出所有的两种数字组合的情况(相当于列举抽取的a+b的值)

再用m-(a+b)表示(c+d),在二维数组中找寻m-(a+b),如果存在(找得到),那么说明就可以为m,否则就说明这种情况不符合

查找的时候,先对二维数组排序,采用二分查找法,减少时间复杂度

总体:算法复杂度为n²log(n)

代码

#include<iostream>
#include<algorithm>
#define N 1000+5
using namespace std;
int n,m;
int a[N];
int b[N*N];//用一维数组 表达二维数组
bool search(int x) {int l=0,r=n*n-1;while(l<r) {int i=(l+r)/2;//二分查找if(b[i]==x)return true;if(b[i]<x)l=i+1;elser=i;}return false;
}
void solve() {for(int i=0; i<n; i++) { //行for(int j=0; j<n; j++) { //列b[i*n+j]=a[i]+a[j];//每个两个纸片的组合均计算包含了}}sort(b,b+N*N);//排序bool c=false;for(int i=0; i<n; i++) {for(int j=0; j<n; i++) {if(search(m-a[i]-a[j])) {//查找剩余的值是否出现在组合情况中c=true;break;}}}/*上述代码修改成这样也可以for(int i=0; i<n*n; i++) {if(search(m-b[i])) {c=true;break;}}
*/if(c==true)cout<<"yes"<<endl;elsecout<<"no"<<endl;
}
int main() {cin>>n>>m;for(int i=0; i<n; i++)//输入卡片上的值cin>>a[i];solve();
}

抽签 c++二分查找相关推荐

  1. 基于二分查找的抽签游戏算法的优化

    基于二分查找的抽签游戏算法的优化 问题描述: 一个袋子里有n个纸片,纸片上有数字,你随机取出4张纸(有放回),若四张纸的数字和为m,你就赢了,否则你就输了.连续试了几次后你都失败了,于是你想知道到底有 ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  4. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  5. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  6. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  7. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  8. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

  9. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

最新文章

  1. 多线程之线程池的应用
  2. jq 通过标签名称获取标签_怎样利用tag标签来获取长尾关键词排名
  3. OpenCV 入门级一
  4. Java 使用GDAL 读写 shapefile
  5. 阿里依然在“飙车”!第一财季净利润309.49亿元 同比增长54%
  6. vim编辑器操作汇总
  7. synchronized 关键字的底层原理
  8. 【渝粤教育】电大中专新媒体营销实务 (14)作业 题库
  9. html优化字体包,『前端开发』- 字体文件大小优化实践
  10. 神策分析 Android SDK 之用户路径采集
  11. 鸿蒙天钟壁纸,鸿蒙2.0桌面小工具时钟,日历显示不出来
  12. 港股通Level2介绍
  13. 通过lua脚本识别微信,支付宝,龙支付
  14. win10无法连接到这个网络_网络打印机连接正常但无法打印
  15. Win10 关闭Bitlocker,Bitlocker解密进度条始终卡在96%的解决方法
  16. C# WebApi 获取今日头条新闻代码
  17. uniapp启动微信小程序报错---initialize
  18. 我的学习笔记004--javascript实现旋转导航菜单mxx
  19. Linux常用命令——最详细!!!!
  20. 最高法重新公布网络著作权司法解释

热门文章

  1. 【软件测试篇5】如何设计测试用例
  2. 内衣蕾丝面料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  3. mysql命令or_常用的MySQL命令大全
  4. 英雄联盟服务器维护2月26,英雄联盟2月20日更新维护公告 LOL更新到几点
  5. 熬夜总结50个Vue知识点
  6. lambda函数介绍
  7. 计算机视觉应用-圆或者圆点检测
  8. 餐饮行业积分兑换商城小程序怎么做?
  9. ORA-02436 date or system variable wrongly specified in check constraint
  10. 计算机与电视如何通过网络连接,笔记本怎么连电视显示屏,电脑通过wifi连接电视图解...