二分查找和二分答案

1.查找

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n, m;

int main(){
	cin>>n>>m;
	for(int i = 1; i <= n; i++) cin>>a[i];
	int k;
	while(m--){
		cin>>k;
		int res = lower_bound(a + 1, a + n + 1, k) - a;
		if(a[res] != k) cout<<-1<<" ";
		else cout<<res<<" ";
	}
	return 0;
}

2.A-B 数对

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
int q[N];
int n, c;

int main(){
	cin>>n>>c;
	for(int i = 1; i <= n; i++) cin>>q[i];
	sort(q + 1, q + n + 1);
	long long ans = 0;
	for(int i = 1; i <= n; i++){
		int b = q[i] - c;
		int res1 = lower_bound(q + 1, q + n + 1, b) - q;
		int res2 = upper_bound(q + 1, q + n + 1, b) - q - 1;
		//cout<<b<<" "<<res1<<" "<<res2<<endl;
		if(q[res1] == b && q[res2] == b) ans += res2 - res1 + 1;
	}
	cout<<ans;
	return 0;
}

3.砍树

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int q[N];
int n, m;

int check(int x){
	long long sum = 0;
	for(int i = 1; i <= n; i++){
		if(q[i] > x) sum += q[i] - x;
	}
	return sum < m;
}

int main(){
	cin>>n>>m;
	for(int i = 1; i <= n; i++) cin>>q[i];
	int l = -1, r = 2e9 + 1;
	while(l + 1 < r){
		int mid = (l + r) / 2;
		if(check(mid)) r = mid;
		else l = mid;
	}
	cout<<l;
	return 0;
}

4.一元三次方程求解

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
double a, b, c, d;

double check(double x){
	double sum = a * x * x * x + b * x * x + c * x + d;
	return sum;
}

int main(){
	cin>>a>>b>>c>>d;
	int f = 0;
	for(int i = -100; i <= 100; i++){
		if(f == 3) break;
		double l = i - 0.5, r = i + 0.5;
		if(check(l) * check(r) <= 0){
			if(check(l) >= 0){
				while(l + 0.00001 < r){
					double mid = (l + r) / 2;
					if(check(mid) > 0) l = mid;
					else r = mid; 
				}
			}else if(check(l) < 0){
				while(l + 0.00001 < r){
					double mid = (l + r) / 2;
					if(check(mid) < 0) l = mid;
					else r = mid; 
				}
			}
			f++;
			printf("%.2lf ", r);
		}
	}
	return 0;
}

5.烦恼的高考志愿

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int m, n;

int main(){
	cin>>m>>n;
	for(int i = 1; i <= m; i++) cin>>a[i];
	sort(a + 1, a + m + 1);
	long long ans = 0, x;
	for(int i = 1; i <= n; i++){
		cin>>x;
		int l = 0, r = m + 1;
		while(l + 1 < r){
			int mid = (l + r) / 2;
			if(a[mid] < x) l = mid;
			else r = mid;
		}
		//cout<<l<<" "<<r<<endl;
		if(x < a[1]) ans += a[1] - x;
		else ans += min(abs(x - a[l]), abs(x - a[r]));
	}
	cout<<ans;
	return 0;
}

6.木材加工

在这里插入图片描述
无解的时候,可以取到左边界 l

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n, k;

int check(int x){
	long long cnt = 0;
	for(int i = 1; i <= n; i++){
		cnt += a[i] / x;
	}
	return cnt < k;
}

int main(){
	cin>>n>>k;
	for(int i = 1; i <= n; i++) cin>>a[i];
	int l = 0, r = 1e8 + 1;
	while(l + 1 < r){
		int mid = (l + r) / 2;
		if(check(mid)) r = mid;
		else l = mid;
	}
	cout<<l;
	return 0; 
}

7.跳石头

在这里插入图片描述
二分最短跳远距离的最大长度

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5e4 + 10;
int a[N];
int len, n, m;

int main(){
	cin>>len>>n>>m;
	int t = 0, x;
	for(int i = 1; i <= n; i++){
		cin>>x;
		a[i] = x - t;
		t = x;
	}
	a[n + 1] = len - t;
	//for(int i = 1; i <= n + 1; i++) cout<<a[i]<<" ";
	if(n == m){
		cout<<len;
	}else{
		int l = 0, r = len / (n - m) - 1;
		while(l + 1 < r){
			int mid = (l + r) / 2;
			int cnt = 0, res = 0;;
			for(int i = 1; i <= n + 1; i++){
				res = a[i];
				while(res < mid && i <= n){
					cnt++;
					res += a[++i];
				}
			}
			if(cnt <= m) l = mid;
			else r = mid;
		}
		cout<<l;
	}
	return 0; 
}

8.路标设置

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int len, n, k;

int main(){
	cin>>len>>n>>k;
	int x, t = 0;
	for(int i = 1; i <= n; i++){
		cin>>x;
		a[i] = x - t;
		t = x;
	}
	a[n + 1] = len - t;
	int l = 0, r = len;
	while(l + 1 < r){
		int mid = (l + r) / 2;
		int cnt = 0, res;
		for(int i = 1; i <= n + 1; i++){
			res = a[i];
			while(res > mid){
				cnt++;
				res -= mid;
			}
		}
		if(cnt <= k) r = mid;
		else l = mid;
	}
	cout<<r;
	return 0;
}

9.数列分段

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, m;

int main(){
	cin>>n>>m;
	int l = 0, r = 0;
	for(int i = 1; i <= n; i++){
		cin>>a[i];
		l = max(l, a[i]);
		r += a[i];
	}
	l--, r++;
	while(l + 1 < r){
		int mid = (l + r) / 2;
		int res, cnt = 0;
		for(int i = 1; i <= n; i++){
			res = a[i];
			cnt++;
			while(res + a[i + 1] <= mid && i < n){
				res += a[++i];
			}
		}
		if(cnt <= m) r = mid;
		else l = mid;
	}
	cout<<r;
	return 0;
}

10.银行贷款

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int a, b, c;

double check(double x){
	double res = a;
	for(int i = 1; i <= c; i++){
		res = res * (1 + x) - b;
	}
	return res;
}

int main(){
	cin>>a>>b>>c;
	double l = 0, r = 3, ans;
	while(l + 0.00001 < r){
		double mid = (l + r) / 2;
		if(check(mid) > 0) r = mid;
		else if(check(mid) < 0) l = mid;
		else{
			ans = mid * 100;
			break;
		}
		ans = mid * 100;
	}
	printf("%.1lf", ans);
	return 0;
}

11.小鸟的设备

在这里插入图片描述
二分可以使用的时间,边界一定要取到 [0, 1e10]

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, p;

int check(double x){
	double res = 0;
	for(int i = 1; i <= n; i++){
		double t = b[i] - a[i] * x;
		if(t < 0) res += -t;
		if(res > x * p) return 0; 
	}
	return 1;
}

int main(){
	cin>>n>>p;
	for(int i = 1; i <= n; i++) cin>>a[i]>>b[i];
	double l = 0, r = 1e10;
	while(l + 0.00001 < r){
		double mid = (l + r) / 2;
		if(check(mid)) l = mid;
		else r = mid;
	}
	if(r >= 1e10) cout<<-1;
	else printf("%.10lf", l);
	return 0;
}

相关推荐

  1. 天秀基础算法 - 二分查找二分答案

    2024-04-07 09:34:03       33 阅读
  2. 二分查找.

    2024-04-07 09:34:03       29 阅读
  3. 二分答案刷题

    2024-04-07 09:34:03       60 阅读
  4. 二分答案算法

    2024-04-07 09:34:03       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 09:34:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 09:34:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 09:34:03       87 阅读
  4. Python语言-面向对象

    2024-04-07 09:34:03       96 阅读

热门阅读

  1. 面试前端八股文十问十答第九期

    2024-04-07 09:34:03       32 阅读
  2. 2024.4.6学习笔记

    2024-04-07 09:34:03       35 阅读
  3. ip命令

    2024-04-07 09:34:03       39 阅读
  4. 蓝桥杯每日一练

    2024-04-07 09:34:03       31 阅读
  5. PHP radis 分布式缓存简单示例

    2024-04-07 09:34:03       35 阅读
  6. 逻辑回归详解

    2024-04-07 09:34:03       142 阅读
  7. vscode 快捷键自定义

    2024-04-07 09:34:03       42 阅读
  8. 软件开发师学习

    2024-04-07 09:34:03       41 阅读
  9. 5568: 【J1】【栈】后缀表达式

    2024-04-07 09:34:03       39 阅读
  10. Kali Linux国内知名镜像源

    2024-04-07 09:34:03       39 阅读
  11. 【openGL4.x手册13】色彩混合blend

    2024-04-07 09:34:03       30 阅读
  12. c#编程基础学习之方法

    2024-04-07 09:34:03       51 阅读