抽签 c++二分查找
【题目描述】:
将写有数字的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++二分查找相关推荐
- 基于二分查找的抽签游戏算法的优化
基于二分查找的抽签游戏算法的优化 问题描述: 一个袋子里有n个纸片,纸片上有数字,你随机取出4张纸(有放回),若四张纸的数字和为m,你就赢了,否则你就输了.连续试了几次后你都失败了,于是你想知道到底有 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- 二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...
- python数据结构与算法:二分查找
二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...
- 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...
最新文章
- 多线程之线程池的应用
- jq 通过标签名称获取标签_怎样利用tag标签来获取长尾关键词排名
- OpenCV 入门级一
- Java 使用GDAL 读写 shapefile
- 阿里依然在“飙车”!第一财季净利润309.49亿元 同比增长54%
- vim编辑器操作汇总
- synchronized 关键字的底层原理
- 【渝粤教育】电大中专新媒体营销实务 (14)作业 题库
- html优化字体包,『前端开发』- 字体文件大小优化实践
- 神策分析 Android SDK 之用户路径采集
- 鸿蒙天钟壁纸,鸿蒙2.0桌面小工具时钟,日历显示不出来
- 港股通Level2介绍
- 通过lua脚本识别微信,支付宝,龙支付
- win10无法连接到这个网络_网络打印机连接正常但无法打印
- Win10 关闭Bitlocker,Bitlocker解密进度条始终卡在96%的解决方法
- C# WebApi 获取今日头条新闻代码
- uniapp启动微信小程序报错---initialize
- 我的学习笔记004--javascript实现旋转导航菜单mxx
- Linux常用命令——最详细!!!!
- 最高法重新公布网络著作权司法解释
热门文章
- 【软件测试篇5】如何设计测试用例
- 内衣蕾丝面料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- mysql命令or_常用的MySQL命令大全
- 英雄联盟服务器维护2月26,英雄联盟2月20日更新维护公告 LOL更新到几点
- 熬夜总结50个Vue知识点
- lambda函数介绍
- 计算机视觉应用-圆或者圆点检测
- 餐饮行业积分兑换商城小程序怎么做?
- ORA-02436 date or system variable wrongly specified in check constraint
- 计算机与电视如何通过网络连接,笔记本怎么连电视显示屏,电脑通过wifi连接电视图解...