首页 > 编程语言 >【基础算法】二分答案

【基础算法】二分答案

时间:2024-03-03 20:11:16浏览次数:27  
标签:二分 int mid long 算法 答案 check

二分答案

什么是二分答案?

将答案区间进行二分,不断缩小答案区间,直到区间缩小到符合题意的答案。

我们又该怎么书写呢?

常用的二分模版:

// 不断缩小答案区间
while (l <= r)
{
    int mid = l + r >> 1;
    if (check(mid)) r = mid - 1;
    else l = mid + 1;
}

模版的含义

\(l\) 表示答案的左端点,一般是 \(0\) 或者 \(1\) 。

\(r\) 表示答案的右端点,这个就要根据题目来确定了。

check函数怎么写?

根据题目的要求

例一:P9240 冶炼金属

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10010;
int a[N], b[N];
int n;
bool check1(int x)
{
	for (int i = 1; i <= n; i++)
		if (a[i] / x > b[i]) 
			return true;
	
	return false;
}
bool check2(int x)
{
	for (int i = 1; i <= n; i++)
		if (a[i] / x < b[i])
			return true;
	
	return false;
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i] >> b[i];
	int l1 = 1, r1 = 1e9;
	while (l1 <= r1)
	{
		int mid = (LL)(l1 + r1) / 2;
		if (check1(mid)) l1 = mid + 1;
		else r1 = mid - 1;
	}
	int l2 = 1, r2 = 1e9;
	while (l2 <= r2)
	{
		int mid = (LL)(l2 + r2) / 2;
		if (check2(mid)) r2 = mid - 1;
		else l2 = mid + 1;
	}
	cout << l1 << ' ' << r2 << endl;
	return 0;
}

例二:P2440 木材加工

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, k;
int a[N];
bool check(int x)
{
	int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		cnt += a[i] / x;
	}
	return cnt < k;
}
int main()
{
	cin >> n >> k;
	LL sum = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	int l = 1, r = sum / k;
	while (l <= r)
	{
		int mid = l + r >> 1;
		if (check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	cout << r << endl;
	return 0;
}

标签:二分,int,mid,long,算法,答案,check
From: https://www.cnblogs.com/yhgm/p/18050603

相关文章

  • 如何判断算法的好坏?
    事后统计法(直接运行两个算法程序后比较运行速度)1.过于依赖测试数据 2.过于依赖硬件条件事前分析法     时间复杂度  大O表示法  ......
  • 动手学强化学习(五):时序差分算法
    第5章时序差分算法5.1简介第4章介绍的动态规划算法要求马尔可夫决策过程是已知的,即要求与智能体交互的环境是完全已知的(例如迷宫或者给定规则的网格世界)。在此条件下,智能体其实并不需要和环境真正交互来采样数据,直接用动态规划算法就可以解出最优价值或策略。这就好比对于......
  • Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、
    C.TeaTasting思路这里枚举有三种思路然后经过考虑3是最可行的,然后接着考虑如何计算贡献这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不满\(b_i\)的用\(c_i\)记录,最后计算一下答案即可。#include<bits/stdc++.h>#defineintlon......
  • 算法模板 v1.9.1.20240303
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • day52 动态规划part10 代码随想录算法训练营 122. 买卖股票的最佳时机 II
    题目:122.买卖股票的最佳时机II我的感悟:只要定义清楚,就可以做出来的。理解难点:先判断等于听课笔记:看了文字版本,感觉还是我的思路最牛逼!!我的代码:classSolution:defmaxProfit(self,prices:List[int])->int:#dp[i]为截止到当前能获得的最大利润......
  • day53 动态规划part10 代码随想录算法训练营 121. 买卖股票的最佳时机
    题目:121.买卖股票的最佳时机我的感悟:soeasy 打印dp确实能发现问题理解难点:注意条件,及时更新dp听课笔记:看了,老师的代码,感觉没有我的简洁,哈哈!!我的代码:classSolution:defmaxProfit(self,prices:List[int])->int:#设dp[i]为截止到当前能获得......
  • 动手学强化学习(四):动态规划算法
    第4章动态规划算法4.1简介动态规划(dynamicprogramming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决......
  • day52 动态规划part9 代码随想录算法训练营 337. 打家劫舍 III
    题目:337.打家劫舍III我的感悟:跳过,目前树的不学理解难点:树的理解,以及树的遍历听课笔记:我的代码:通过截图:老师代码:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#......
  • day52 动态规划part9 代码随想录算法训练营 213. 打家劫舍 II
    题目:213.打家劫舍II我的感悟:看了题解不难,就是环这个思路转化很重要!理解难点:环的转化为,首,尾。代码上面可以省略长度为2的校验听课笔记:分3中情况:不考虑首尾|考虑首|考虑尾而情况2和情况3包含了情况1我的代码:classSolution:defrob(self,nums:List[i......
  • C++新U4-贪心算法1
    学习目标贪心算法的概念[【贪心算法(一)】书架]    【题意分析】选出最少的奶牛数量,让他们的身高相加超过书架的高度。【思路分析】优先选择身高高的奶牛,这样子奶牛使用的数量最少。定义排序规则,将数从大到小排序定义奶牛数量n和书架高度b,并且输入输......