[Dicotomía] búsqueda binaria y el uso

La búsqueda binaria

(Sal: Los libros de referencia: Desafíos programación)

Encuentra dicotomía: al reducir el alcance de la solución existe, con el fin de encontrar un elemento específico del algoritmo de búsqueda de matriz.
Dicotomía se ve a menudo en combinación con otros algoritmos de temas

Dicotomía de las ideas:

(1) En primer lugar, iniciar la búsqueda desde la mitad de la matriz, si el valor de la posición es exactamente el objetivo, y luego encontrar, para finalizar la búsqueda.

(2) si el primer paso es la búsqueda de un valor mayor que el objetivo, poner la matriz en un medio, en la matriz a la derecha para encontrar la región, a continuación, repetir las etapas (1) operación.
Si el primer paso de la buscó valor es menor que el objetivo, poner la matriz en un medio, en la matriz de la izquierda para encontrar la región, a continuación, repetir las etapas (1).

(3) Si la matriz se divide en unos elementos restantes todavía no puede encontrar, no puede encontrar su significado.

Encontrar un simple izquierda a derecha, el tiempo es O (n), un tiempo de búsqueda binaria de O (log n).

Por lo general, escrito aproximadamente como sigue:

	//二分
	int l=0,r=n;		//	l:左边 r:右边 
	while(l<=r){
		int mid = (l+r)/2;
		if(a[mid]== k){
			cout<<mid;
			break;
		}
		if(a[mid] > k){
			r = mid-1;
		}else{
			l = mid+1;
		}
	}

En relación con el uso de

Más de un tiempo bueno, escribí sobre son como arriba, L, R es el índice de índices de matriz de inicio y cola.

Sin embargo, algunos problemas, debido a la naturaleza del tema, escrito arriba no pueden hacer esto (que pueden haber sido demasiado débil 55)
de tal manera que la siguiente manera:
Aquí Insertar imagen Descripción
el tipo habitual de escribir cada índice es mover hacia delante o hacia atrás, se utiliza en la búsqueda de un número que está presente en la matriz
y este problema es exigir un número real, y el valor que no aparece en la matriz.
¿Cómo hacer eso? En caso de ser L, R es el rango como la respuesta, y después con dietil requisitos puntos.
Escribir algo como esto:

#include<iostream>
#include<cstdio>
using namespace std;
#include<cmath>
const int maxn = 10005;
int n,k;
double a[maxn];


bool f(double x){
	int cnt=0;
	for(int i=1;i<=n;i++){
		cnt += (int)(a[i]/x); 
	}
	return cnt>=k;
}
int main(){
	cin>>n>>k;
	double len = 0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		len += a[i];
		
	}
	// 二分
	double l =0,r = len;
	for(int i=0;i<100;i++){
		double mid = (l+r)/2;
		if(f(mid)){
			l = mid;
		}else{
			r = mid;
		}
	}
//	cout<<l-1;
	printf("%.2f",l);
	return 0;
}

Esta dicotomía, L, R valor ya no es un estándar de izquierda, pero el rango de la izquierda y derecha de las respuestas de destino,

Escribiendo plantilla:

// 二分
	int l =-1,r = n;
	while(r-l>1)
		int mid = (l+r)/2;
		if(a(mid) >=k){  //如果解满足条件,则解存在的范围变为(l,mid]
			r = mid;
		}else{
			l = mid;	 //如果解不满足条件,则解存在的范围变为(mid,r]
		}
	}
	cout<<r;

Maximizando el rango mínimo de problemas

Similar a maximizar el mínimo, el máximo minimizar, maximizar la media, por lo general tiene que utilizar una búsqueda binaria,
tales como los siguientes esto, otra no cómo decirlo, más o menos lo mismo.
Aquí Insertar imagen Descripción

#include<iostream>
#include<cstdio>
using namespace std;
#include<algorithm>
const int maxn = 100005;
int n,m;
int x[maxn];

bool f(int d){
	
	int last = 0;
	for(int i=1;i<m;i++){
		int k=last+1;
		while(x[k] - x[last] <d && k<n){
			k++;
		}
		if(k ==n){
			return false;
		}
		last = k;
	}
	return true;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>x[i];
	}
	sort(x,x+n);
	
	int l=0,r=1e8; 
	while(r-l>1){
		int mid = (l+r)/2;
		if(f(mid)){
			l = mid;
		}else{
			r = mid;
		}
	}
	cout<<l;
	return 0;
} 
Publicado 75 artículos originales · ganado elogios 1 · vistas 3629

Supongo que te gusta

Origin blog.csdn.net/A793488316/article/details/105185602
Recomendado
Clasificación