ACwing算法基础课听课笔记(第一章,基础算法一)(二分)
二分法:
在看这个视频前,我对于二分法是一头雾水的,又加上这个算法我个人很容易写错emm...。视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开整!
对于例题 789:数的范围,寻找一个数前后第一次与最后一次出现的坐标。我们需要这个模板:

数组定为number[];
(1)来看第一种情况:如图,假设两个点分别是最先与最后出现的位置。求第一次x出现的位置实际上就是(1)这种情况。那么我们定一个条件
mid=(l+r)>>1 if(number[mid]在a中)
r=mid; 区间变为[L,mid], 因为mid处可能是答案,所以mid不要加一也不要减一。
else(落在b中)
l=mid+1; 区间变为[mid+1,R]
(2)来看第二种情况:如图,就是求x最后一次出现的位置了。依然是
int mid=(l+r+1)>>1; if(number[mid]在b中)
l=mid 区间变为[mid,R],mid不要动因为mid处可能是答案
else
r=mid-1 因为mid处肯定不是答案,所以要减一,区间变为[L,mid-1];
但是注意要注意(2)中的(L+r+1)>>1,因为如果 l=r-1时,式子不加一会出现mid=L+1/2,因为向下取整,所以mid=L,进入if后会一直求出区间[L,R]造成死循环,而(1)就不会出现。
综上,有以下两个模板,分别对应不同的情况
//区间[L,R]被分成[L,mid]和[mid+1,R]时
int bsearch_1(int l,int r)
{
while(l<r)
{
int mid=l+r >>;
if(check(mid))
r=mid;
else
l=mid+;
} }
//区间[L,R]被分成[L,mid-1]和[mid,R]时
int bsearch_2(int l,int r)
{
while(l<r)
{
int mid=l+r+ >>;
if(check(mid))
l=mid;
else
r=mid-; }
}
然后上789代码 :
#include<iostream>
const int maxn=1e5+;
using namespace std; int a[maxn];
int n,k;
int main()
{
cin>>n>>k;
for(int i=;i<n;i++)
cin>>a[i];
while(k--)
{
int x;
cin>>x;
int l=,r=n-;
while(l<r)
{
int mid=(l+r)>>;
if(a[mid]>=x)
{
r=mid;
}
else
{
l=mid+;
}
}
if(a[l]!=x)
cout<<"-1 -1"<<endl;
else
{
cout<<l<<' ';
int l=,r=n-;
while(l<r)
{
int mid=(l+r+)>>;
if(a[mid]<=x)
{
l=mid;
}
else
r=mid-;
}
cout<<r<<endl;
}
}
}
再来个手动开方嘿嘿,二分法:
#include<iostream>
using namespace std;
#include<cstdio>
int main()
{
double x;
while(cin>>x)
{
double l=,r=x;
while((r-l)>1e-)//精度不够再加,可以时1e-8
{
double mid=(l+r)/;
if(mid*mid>x)
r=mid;
else
l=mid;
}
printf("%lf\n",l);
}
}
开三次方:ACWING 790
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
double x;
while(cin>>x)
{
double l,r;
if(x>=)
l=,r=x;
else
l=x,r=;
while(fabs(r-l)>1e-)
{
double mid = (l+r)/;
if(mid*mid*mid>x)
r=mid;
else
l=mid;
}
printf("%lf\n",l);
}
}
ACwing算法基础课听课笔记(第一章,基础算法一)(二分)的更多相关文章
- .net架构设计读书笔记--第一章 基础
第一章 基础 第一节 软件架构与软件架构师 简单的说软件架构即是为客户构建一个软件系统.架构师随便软件架构应运而生,架构师是一个角色. 2000年9月ANSI和IEEE发布了<密集性软件架构建 ...
- ACwing算法基础课听课笔记(第一章,基础算法二)(差分)
前缀和以及二维前缀和在这里就不写了. 差分:是前缀和的逆运算 ACWING二维差分矩阵 每一个二维数组上的元素都可以用(x,y)表示,对于某一元素(x0,y0),其前缀和就是以该点作为右下角以整 ...
- 《Python基础教程(第二版)》学习笔记 -> 第一章 基础知识
写笔记的原因:书也看了一遍,视频也看了,但总是感觉效果不好,一段时间忘记了,再看又觉得有心无力,都是PDF的书籍,打开了就没有心情了,上班一天了,回家看这些东西,真的没多大精力了,所以,我觉得还是把p ...
- Laxcus大数据管理系统2.0(2)- 第一章 基础概述 1.1 基于现状的一些思考
第一章 基础概述 1.1 基于现状的一些思考 在过去十几年里,随着互联网产业的普及和高速发展,各种格式的互联网数据也呈现爆炸性增长之势.与此同时,在数据应用的另一个重要领域:商业和科学计算,在各种新兴 ...
- 《openssl编程》:第一章基础知识
第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...
- C++ Primer 笔记 第一章
C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...
- Linux系统shell编程自学_第一章基础
第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- Android群英传笔记——第一章:Android体系与系统架构
Android群英传笔记--第一章:Android体系与系统架构 图片都是摘抄自网络 今天确实挺忙的,不过把第一章的笔记做一下还是可以的,嘿嘿 1.1 Google的生态圈 还是得从Android的起 ...
随机推荐
- ACM-小偷的背包
题目描述:小偷的背包 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn.问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S.如果有满足条 ...
- ArcoLinux美化教程
ArcoLinux美化教程 1. 前言 ArcoLinux已经足够美观,这里主要是讲解如何配置桌面特效 2. 安装compiz $ yay -S compiz 3. 用compiz替换xfwm4 编辑 ...
- 网卡工作原理和wireshark混杂模式
通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主机的数据包 这是为什么呢? 即主机A发送一个数据包给主机B,我作为主机C怎么也能截获这个数据包呢,原理是什么? 我的网卡为 ...
- HDU - 6152 Friend-Graph(暴力)
题意:给定n个人的关系,若存在三个及以上的人两两友好或两两不友好,则"Bad Team!",否则"Great Team!". 分析:3000*3000内存100 ...
- Fedora Workstation 31众多功能得到改进
导读 周一,Red Hat的桌面高级经理Christian F.K. Schaller分享了一篇博客文章,概述了Fedora Workstation 31的各种改进和特性.这些包括Wayland的改进 ...
- Git TortoiseGit github 操作
由于公司采用了分布式架构,选择的是gitlab git 来管理代码等工作,鉴于github和gitlab的相似性,网上查看好多都是用git的命令上传,或者是一部分,为此,借鉴多方网络,并进行实际操作, ...
- 基于springboot实现Java阿里短信发送
1.接口TestController import java.util.Random; import com.aliyuncs.DefaultAcsClient; import com.aliyunc ...
- XPath--快速获取XML数据的节点或属性
转载自 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" ...
- jedis哨兵模式的redis组(集群),连接池实现。(客户端分片)
java 连接redis 我们都使用的 是jedis ,对于redis这种频繁请求的场景我们一般需要对其池化避免重复创建,即创建一个连接池 ,打开jedis的 jar包我们发现,jedis对池已经有 ...
- HDU - 5586 Sum(区间增量最大)
题意:将数组A的部分区间值按照函数f(Ai)=(1890*Ai+143)mod10007修改值,区间长度可以为0,问该操作后数组A的最大值. 分析:先求出每个元素的增量,进而求出增量和.通过b[r]- ...