首页 > 编程语言 >洛谷二分题单和二分算法

洛谷二分题单和二分算法

时间:2024-02-01 16:11:58浏览次数:25  
标签:二分 洛谷 int double mid bound 满足 题单

在题目有出现极值的时候可以运用二分算法,像最小值最大化和最大值最小化又或者像会有中位数,大于这个数的时候可以把他全部视为1小于这个数可以全部视为0,这样隐藏的单调也是可以运用二分。最难的好像就是check函数的设计

板子的不同会导致L,R和mid的关系不然会超时,L+1<R的L是=mid,而L<=R的是L=mid+1

1:查找

好像没东西说,就是没找到输出-1可以通过a【r】==x来判断是否输出-1

2.A-B数对

在判断A-B=C这一过程可以变为A-C=B这个式子更加简单便捷,然后因为这是一个查找有多少个数子满足的,所以需要有两个check函数一个获取第一个另一个来获取第二个最后相减这样就对if条件判断当取等的时候是L=mid还是R=mid

另一个方法是运用lower_bound/upper_bound;

lower_bound:lower_bound(a,a+n,x)-a这样就可以满足返回值i是最小的下标i满足ai>=x

upper_bound:upper_bound(a,a+n,x)-a返回值i满足最小ai>x

注意的是这两个需要减去数组名a

3:砍树

没东西特别啊

4:一元三次方程求解

题目这句话是解题的突破点:根与根之差的绝对值 ≥1这样在求根的时候只要把距离设为1然后看端点相乘是否小于0,如果小于0则在这个距离之间二分;

另一个的是精度之间的选择,题目给的控制精度是0.00那么我们在while判断的里面就要选择r-l>=0.001

五:高考志愿

突破点在于同学的分数要介于两个分数之间,我们二分出来的L和R就要满足a[L]<分数<a[R]

六:木材加工

这题也是简单吧只要设x满足根据这个x切出来的木材是否有满足大于等于所需的木材数

七:跳石头

注意点在于不能把第n块石头当作终点

然后设最小值当距离大于这个值就不移走小于的就要移除之后判断移除数是否小于设定值。注意要设个now判断是和now值比

八:路标设置

我觉得最难的就是还是和高考志愿一样需要设个now值,然后对now值的改变,以及i--防止判断不满足而忽略

if(sit[i]-size<=m)
		{
			size=sit[i];//成立则移动比较位置,比较下一组
		}
		else
		{
			size=size+m;//设置新的路标,前一个路标已满足,移动位置到新路标
			i--;//防止因为循环把之前的路标给移走了!
			y--;//减少可用新路标数
		}

  

九:数列分段

关键点是能加则加不能加就不加;

十:银行贷款

还是对精度的控制还有还钱的过程需要考虑

for (int i = 0; i < c; ++i)//模拟还钱过程。
            w = w - b + w * (mid / 100);

 

十一:设备

当时不会做大概是因为不懂对充电宝的能量怎么处理不懂到底什么时候给谁充多久的电后面看题解发现只要满足所有所需的电量和充电宝的电量关系就可以了。看代码吧还更好懂

#include  <iostream>
using namespace std;
int n;//设备数量
double p;//充电器的充电速度
double a[200000],b[200000];
double lbound=0,rbound=1e10;
double sum=0; //需要的能量总和(验证答案时)、所有设备的消耗能量速度总和(-1特判时)
int check(double ans){//验证答案
	double q=p*ans;//充电器最多提供的能量
	sum=0;
	for(int i=0;i<n;i++){
		if(a[i]*ans<=b[i]){//若设备已有的能量大于使用时间需要的能量
			continue;//忽略该设备
		}
		sum+=(a[i]*ans-b[i]);//否则用充电器充电,使设备已有的能量等于使用时间需要的能量,并记录需要的能量。
	}
	return sum<=q;//最后比较需要的能量总和和充电器最多提供的能量。
}
int main(){
	cin>>n>>p;
	for(int i=0;i<n;i++){
		cin>>a[i]>>b[i];
		sum+=a[i];
	}
	if(sum<=p){//若所有设备的消耗能量速度总和还是小于充电器的充电速度,输出-1。
		cout<<-1.000000<<endl;
		return 0;
	}
	while(rbound-lbound>1e-6){
		double mid=(lbound+rbound)/2;
		if(check(mid)){
			lbound=mid;
			
		}else{
			rbound=mid;
			
		}
	}
	cout<<lbound<<endl;
	return 0;
}

  

 

标签:二分,洛谷,int,double,mid,bound,满足,题单
From: https://www.cnblogs.com/sixsix666/p/18000335

相关文章

  • 【学习笔记】二分图匹配 匈牙利(NTR)算法
    时间复杂度显然,这个算法的时间复杂度是O(一边的点数*边数)因为最坏情况就是每一个点都要把所有的边问一遍能不能匹配显然,常数极小另外可以留意一下数据范围,因为如果是稠密图(\(n=500m=2e5\)这种)就可以考虑邻接矩阵存图,方便判重边S准备以下是跑Ntr算法要用的一些东西如果题......
  • 洛谷题单指南-暴力枚举-P3654 First Step (ファーストステップ)
    原题链接:https://www.luogu.com.cn/problem/P3654题意解读:在r*c矩阵中,找连续k个.的总数。解题思路:本题直接枚举即可,在每一行中,以每一列为起点,连续判断k个元素,如果全为'.',则方案数加1在每一列中,以每一行为起点,连续判断k个元素,如果全为'.',则方案数加1注意:如果k=1,只有一个人......
  • 洛谷题单指南-暴力枚举-P3392 涂国旗
    原题链接:https://www.luogu.com.cn/problem/P3392题意解读:此题枚举白、蓝、红所有可能的行数组合,依次逐行判断每个方格,是否需要染色,计算最少的染色次数即可。解题思路:总行数是n,先考虑白色,第一行必是白色,最后一行必是红色,至少有一行蓝色,因此白色行数的范围是1~n-2再考虑蓝......
  • 二分查找
    704.二分查找(Easy)问题描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输......
  • 洛谷 P4580 [BJOI2014] 路径
    传送门分析可以考虑dp。先朴素地定义\(dp[i][j]\)表示当前在结点\(i\),已经走过了\(j\)个结点(含当前)的方案数。发现没法处理括号匹配,于是加一维\(k\)表示当前还剩\(k\)个前括号没有匹配。又发现没法处理前导\(0\)。于是考虑再加一维表示当前的最后一位是什么状态。发......
  • 洛谷 P3976 [TJOI2015] 旅游
    这出题人语言表达能力真的感人……希望你们看完这篇题解后不要觉得我的语言表达能力和出题人不相上下。题目大意给定一棵有点权的树,每次询问从\(u\)到\(v\)的路径上后经过的点权减去先经过的点权的最大值,再把这条路径上所有点的点权加上一个给定的数。分析俗话说得好:如果......
  • 洛谷 P1438 无聊的数列
    这题题解的做法千奇百怪,有写了两棵线段树的,有线段树套差分的,还有线段树套二阶差分的。我承认是我看不懂所以我决定写一篇只用一棵线段树的题解。分析众所周知,普通线段树的懒标记存的是一个待更新的量。那对于这个题来说,直接存和(也就是add操作在这个线段上的影响)肯定是不切实际......
  • 洛谷 P4429 [BJOI2018] 染色
    洛谷传送门LOJ传送门非常有趣的结论题。首先显然,整个图不是二分图就无解。然后显然每个连通块独立,可以分连通块判定。然后发现一度点是没什么用的,因为无论和它相连的点颜色是什么,它都能找到一种和这种颜色不同的颜色。所以考虑类似拓扑排序剥一度点。剩下的图的\(deg_u\ge......
  • 洛谷题单指南-暴力枚举-P1088 [NOIP2004 普及组] 火星人
    原题链接:https://www.luogu.com.cn/problem/P1088题意解读:火星人的手指可以通过全排列来表示数字,全排列由小到大的顺序即为表示的数字大小,题目可以转化为:给定按顺序全排列中的某一个排列,求往后数m个排列的内容。解题思路:此题与经典全排列问题的差异在于,需要从指定一个排列开......
  • C语言实现二分法
    现在有一个任务:从一堆有序数字中找出其中一个数字有两种方法1)从头到尾依次寻找2)从该些数字中中间部位比较若小于要找数字则在后半部分否则在前半部分再进行这样的方式进行循环,直至找到或找不到此数字现介绍这样的方法——二分法在计算机科学中,二分搜索(英语:binarysearch),也称折半搜......