「「 「 Algoritmo básico」 」" Nº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
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
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 d或medio 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
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 - L取min 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;
}