首页 > 编程语言 >C++U4-第05课-二分查找

C++U4-第05课-二分查找

时间:2023-11-20 15:14:03浏览次数:35  
标签:二分 return 05 int U4 cin C++ mid include

上节课作业部分(点击跳转)

 

 引入

分治算法概念 

 二分法分治思想

编程题 

 二分查找能解决的问题不仅仅是找到一个值

 题1:

 

要在一个有序序列中查找一个数,可以使用二分算法。

include <iostream>

using namespace std;

int BinarySearch(int a[], int l, int r,int x) {
while (l <= r) {
int mid = (l + r) >> 1;
if (a[mid] == x) return mid;
else if (a[mid] > x) r = mid - 1;
else l = mid + 1;
}
return -1;
}
int main() {
int n;
int a[109];
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int x;
cin >> x;
int l = 1, r = n;
cout << BinarySearch(a, 1, n, x);
return 0;
}

View Code

 

题2:[【二分查找】第一个大于等于x的数]

要在一个有序序列中查找第一个大于等于 x 的数,可以使用二分算法。

include <iostream>

using namespace std;

int BinarySearch(int a[], int l, int r,int x) {
int ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (a[mid] >= x) {
r = mid - 1;
ans = mid;
}
else {
l = mid + 1;
}
}
return ans;
}
int main() {
int n;
int a[109];
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int x;
cin >> x;
int l = 1, r = n;
cout << BinarySearch(a, 1, n, x);
return 0;
}

View Code

 

最后一个等于x

 这俩题同一个代码,都是往右找

要在一个有序序列中查找最后一个等于 x 的数,可以使用二分算法。

include <iostream>

using namespace std;

int BinarySearch(int a[], int l, int r,int x) {
int ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (a[mid] <= x) {
l = mid + 1;
ans = mid;
}
else {
r = mid - 1;
}
}
if (a[ans] == x) {
return ans;
}
return -1;
}
int main() {
int n;
int a[109];
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int x;
cin >> x;
int l = 1, r = n;
cout << BinarySearch(a, 1, n, x);
return 0;
}

View Code

 

 

[【二分查找】lower_bound函数]

 

 

 

[【二分查找】upper_bound函数]

 

 

[根号2]

实数二分,按照题意进行二分。

include <iostream>

include <cstdio>

using namespace std;

int main() {
double l = 1, r = 2;
while (l + 1e-5 < r) {
double mid = (l + r) / 2;
printf("%.2f\n", mid);
if (mid * mid >= 2) r = mid;
else l = mid;
}
printf("%.2f\n", l);
return 0;
}urn 0;
}

 

作业部分:

 

 

************

作业1:[【递推】平行线分割平面问题]

【算法分析】
用 a[i] 表示 i 组平行直线最多能将这个圆分割成的部分数
当 i=1 时,a[1]=3
当 i=2 时,a[2]=9
第 i 组平行线的一条直线和前 i–1 组平行线都有不同的交点,且交点数为 2×(i−1)

i>=2时,a[i]=a[i−1]+(交点数+1)×2
代入得: a[i]=a[i−1]+((i−1)×2+1)×2=a[i−1]+4×i−2

【参考代码】

include <iostream>

using namespace std;

const int N = 1e4 + 10;
long long a[N];

int main() {
int n;
cin >> n;
a[1] = 3;
for(int i = 2; i <= n; i++){
// 递推式
a[i] = a[i - 1] + 4 * i - 2;
}
cout << a[n];
return 0;
}

[【递推】小码君的牛肉串]

【算法分析】
f[i] 表示长度为 n 的字符串的涂法个数

f[1]=3
f[2]=8
总长度为 i 时,思考最后一个字符:

1.为 E 或 F,前 i−1 个字符串随便涂,为 2∗f[i−1]

2.为 O 时,i−1 的位置上不能为 O,则最后两个字符为 EO 或 FO,填法数为 2∗f[i−2]

所以递推式为 f[i]=2∗f[i−1]+2∗f[i−2]

【参考代码】

include <iostream>

using namespace std;

long long f[50];

int main(){
int n;
cin >> n;
f[1] = 3;
f[2] = 8;
for(int i = 3; i <= n; i++){
f[i] = 2 * f[i - 1] + 2 * f[i - 2];
}
cout << f[n];
return 0;
}

View Code

 

 选择题

 

正确答案

D

解析

因为两端不能排女生,所以两端只能挑选 5 个男生中的 2 个,有 $A_{5}^2$ 种不同的排法,对于其中任意一种排法,其余六位都有 $A_{6}^6$ 种排法,所以共有 $A_{5}^2 \times A_{6}^6 = 14400$ 种不同的排法。

正确答案

B

解析

先把 1 填入方格有 3 种方法,第二步把填入方格的对应数字填入其它方格,有三种排法,第三步填剩下的两个数字只有一种排法,共有 $3 \times 3 \times 1$ 种排法。

 选做题

【算法分析】
设置二维数组 f,f[i][j] 表示到 (i,j) 的不同的移动路线的数目。

当 i1 或者 j1 时,因为蚂蚁只能向上或者向右走,所以划分的方案数为 1。

其他情况:
f[i][j] 可以由 f[i-1][j] 向上走一步和 f[i][j-1] 向右走一步得来,所以递推式为:f[i][j]=f[i−1][j]+f[i][j−1]

【参考代码】

include <iostream>

using namespace std;

int f[30][30];

int main() {
int m, n;
cin >> m >> n;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 || j == 1) {
f[i][j] = 1;
} else {
f[i][j] = f[i][j - 1] + f[i - 1][j];
}
}
}
cout << f[m][n];
return 0;
}

View Code

 

【算法分析】
设置二维数组 f,f[i][j] 表示将 i 个数划分为 j 个子集的划分数。

当 ij 或者 j1 时,划分的方案数为 1。

其他情况:
f[i][j] 可以由两个部分得来:
(1) 相比于 f[i−1][j−1],f[i][j] 多出的 i 可以单独作为一个子集,有 f[i−1][j−1] 种方法
(2) 相比于 f[i−1][j],f[i][j] 多出的 i 可以放入划分的 j 个子集中的一个,有 f[i−1][j]∗j 种方法

所以 f[i][j]=(f[i−1][j]∗j+f[i−1][j−1])%10007

【参考代码】

include <iostream>

using namespace std;

int f[110][110];

int main() {
int n, r;
cin >> n >> r;
for (int i = 1; i <= n; i++) {
f[i][i] = f[i][1] = 1;
}
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= r; j++) {
f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % 10007;
}
}
cout << f[n][r];
}

View Code

 

 

 

 

 

 

 

标签:二分,return,05,int,U4,cin,C++,mid,include
From: https://www.cnblogs.com/jayxuan/p/17843977.html

相关文章

  • C++U3-第1课-基础排序(一)
    学习目标排序的概念  本阶段会学习的排序有 冒泡排序概念 第一轮比较,与交换 例题1:一趟交换 例题2:多躺比较,冒泡排序 【题意分析】进行n-1趟冒泡排序的过程,每一次输出当前一趟冒泡排序完的结果【思路分析】定义一个n,输入当前的n和储存n个数的数组for......
  • C++使用OpenSSL实现AES-256-CBC加密解密实例----亲测OK
    摘自:https://blog.csdn.net/GerZhouGengCheng/article/details/106103039//AesUtil.h#ifndef__AES_UTIL_H__#define__AES_UTIL_H__#ifdef__cplusplus//告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的extern"C"{#endifstringUTIL_aes_cbc_e......
  • openssl做HMAC实例(C++)----自测OK
    摘自:https://blog.csdn.net/mijichui2153/article/details/1047414601、HMAC简介(1)MAC(MessageAuthenticationCode,消息认证码算法),可以将其认为是含有秘钥的散列(Hash)函数算法;即兼容了MD和SHA算法,并在此基础上加上了秘钥。因此MAC算法也经常被称作HMAC算法。当然HMAC就是“基......
  • GMK4050-ASEMI光伏二极管GMK4050
    编辑:llGMK4050-ASEMI光伏二极管GMK4050型号:GMK4050品牌:ASEMI正向电流:40A反向耐压:50V封装:批号:2023+安装类型:表面贴装型引脚数量:2工作温度:-55°C~150°C类型:光伏二极管GMK4050特性:肖特基势垒高二极管;热阻低;正向压降低,功率损耗低隔离包装设计,非常适合散热;高正向电......
  • openssl做HMAC实例(C++)原文
    摘自:https://blog.csdn.net/mijichui2153/article/details/1047414601、HMAC简介(1)MAC(MessageAuthenticationCode,消息认证码算法),可以将其认为是含有秘钥的散列(Hash)函数算法;即兼容了MD和SHA算法,并在此基础上加上了秘钥。因此MAC算法也经常被称作HMAC算法。当然HMAC就是“基......
  • 一万五千字C++STL【容器】详解(转载)
    一、什么是容器?所谓容器,就是可以承载,包含元素的一个器件,它是STL六大组件之一,是容器、算法、迭代器中最重要也是最核心的一部分。二、STL中各大容器的结构与分类2.1顺序性容器2.1.1什么是顺序性容器?顺序性容器就是将一组具有相同类型的元素以严格的线性形式组织起来2.1.2......
  • [实验任务一]:JAVA和C++常见数据结构迭代器的使用
    信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。实验要求:1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector,list,map和set等......
  • 2023-2024-1 20231305 《计算机基础与程序设计》第八周学习总结
    2023-2024-120231305《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<写上具体方面>......
  • C++ merge()函数
    merge()函数用于将2个有序序列合并为1个有序序列,前提是这2个有序序列的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序序列,其排序规则也和这2个有序序列相同。merge()函数支持自定义规则排序,merge()有两种语法格式//以默认的升序排序作为排......
  • DX后台截图C++实现代码
    DX后台截图C++实现代码文章仅发布于https://www.cnblogs.com/Icys/p/DXGI.html和知乎上。传统的GDIAPI(BitBlt)虽然可以完美的完成后台截图的任务,但是归根结底效率还是太低。直接使用DXGI方法截图只能完成前台窗口的截图,而DXHOOK的截图方法平添风险,以及很多场景不现实。......