[Ybt OJ] [Algoritmo básico Capítulo 3] Algoritmo de bisección

「「 Algoritmo básico」 」"3 3Catálogo dealgoritmos de dicotomía de 3 capítulos
:

A.数列分段
B.防具布置
C.最大均值

A . A.A . Ejemplo111 segmento de secuencia

Enlace de enlace Luo Gul i n k
Inserte la descripción de la imagen aquí

análisis:

Puede guardar el espacio del prefijo y luego considerar un codicioso, ir a la dicotomía, si
puede agregar, si no puede, puede acumular el número de segmentos y finalmente juzgar que el número de segmentos no es menor que mmm es suficiente. Lasuma
con el mismoprefijoesO (n) O (n)O ( n ) complejidad

CÓDIGO:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+5;
int n,m,a[N],l,r;
bool check(int x)
{
    
    
	int cnt=1,sum=0;
	for(int i=1;i<=n;i++)
	{
    
    
		if(sum+a[i]<=x) sum+=a[i];  //贪心
		else cnt++,sum=a[i];
	}
	return cnt<=m;
}
void work()
{
    
    
	while(l<r)  //二分
	{
    
    
		int mid=(l+r)>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
}
int main(){
    
    
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%d",&a[i]);
		l=max(l,a[i]);r+=a[i];
	}
	work(); 
	printf("%d",l);
	
	return 0;
} 

B. SEGUNDO.B . Ejemplo222 disposición de armadura

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

análisis:

Establecer awai awa_ia w ayoMedios 0 00 ~ii¿Cuántas armaduras hay en la posición de i , solo use laclasificación para discutir lacomplejidadO (n) O (n)O ( n )
awai awa_ia w ayoSe puede calcular
si 2 31 - 1 2 ^ {31} -123 1-Si 1 es un número par, toda la línea de defensanotienefallas.
Si laposición dela fallaeskkk tankkk tiene lasimparesposiciones numéricas son otra armaduraincluso-armadura
siawa_k awaka w akUna extraña ans ansa n s debe sermedio mediom i dmedio mediom i d antes entoncesr = midr = midr=m i d
despierto despiertoa w akAn an ans ansa n s está amediados deDespués de m i d ,l = mid + 1 l = mid + 1l=m i d+1

CÓDIGO:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define reg register 
using namespace std;
typedef long long ll;
struct node{
    
    
	ll s,e,d;
}a[200005];
ll T,n,MAX=(1<<31)-1,l,r,mid;
ll awa(ll x)
{
    
    
	ll ans=0;
	for(reg int i=1;i<=n;i++)
	{
    
    
		if(a[i].s>x) continue;
		ans+=(min(x,a[i].e)-a[i].s)/a[i].d+1;  //求防具数量
	}
	return ans;
}
void print()
{
    
    
	if(awa(MAX)%2==0){
    
    
		puts("There's no weakness.");  //没有破绽
		return;
	}else{
    
    
		printf("%d %d\n",l,awa(l)-awa(l-1));
		return;
	}
}
void work()
{
    
    
	l=0,r=MAX;
	while(l<=r)
	{
    
    
		mid=(l+r)>>1;
		if(awa(mid)%2==0) l=mid+1;  //二分
		else r=mid-1;
	}
}
int main(){
    
    
	scanf("%lld",&T);
	while(T--)
	{
    
    
		scanf("%lld",&n);
		for(reg int i=1;i<=n;i++)
			scanf("%lld%lld%lld",&a[i].s,&a[i].e,&a[i].d);
		work();
		print();
	}
	
	return 0;
} 

C . C.C . Ejemplo333 media máxima

Inserte la descripción de la imagen aquí

análisis:

La mitad del promedio del número total obtenido al restar el valor promedio del prefijo y
el binario decimal agregando un directo, cada pequeña fracción fraccional puede
actualizar max max.m a x prefijo sumay cada vez con nuevosumi - L suma_ {iL}s u mi - Lmin minm i n

CÓDIGO:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define reg register 
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+5;
const db add=1e-6;
int ans,n,k;
db a[N],sum[N],l,r,mid;
bool check(db x)
{
    
    
	db minn=1e8,res=-1e8;
	memset(sum,0,sizeof(sum));
	for(reg int i=1;i<=n;i++)
		sum[i]=sum[i-1]+a[i]-x;  //前缀和
	for(reg int i=k;i<=n;i++)
	{
    
    
		minn=min(minn,sum[i-k]);
		res=max(res,sum[i]-minn);  //更新答案
	}
	return res>=0;
}
int main(){
    
    
	scanf("%d%d",&n,&k);
	for(reg int i=1;i<=n;i++)
		scanf("%lf",&a[i]);
	l=0;r=2000;
	while(l+add<r)  //二分
	{
    
    
		db mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	ans=int(r*1000);
	printf("%d",ans);
	
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/dgssl_xhy/article/details/112131442
Recomendado
Clasificación