Vacaciones de invierno 2020 【gmoj2192】 【suma】 【Pseudo-dos puntos】

Descripción del título

Dados n números a1 ... an, encuentre el valor mínimo del valor absoluto de los dos números,
es decir, | ai + aj | (i no es igual a j)

De entrada

La primera línea es un número n
seguido de la siguiente línea n número a1 ... un

Salida

Un número y una línea, el valor mínimo del valor absoluto de dos números sumados

Entrada de muestra

5
-2 6 7 7 -8

Salida de muestra

1

Limitación del rango de datos

• Para el 40% de los datos, n <= 10 3 , -10 6 <= ai <= 10 6 .
• Para el 80% de los datos, n <= 10 5 , -10 6 <= ai <= 10 6 .
• Para 100% de datos, n <= 10 6 , -10 6 <= ai <= 10 6 .

Análisis

¡El valor absoluto más cercano a 1 es definitivamente el mejor!
Primero ordene (requerido), luego use dos variables para "cerrar" de dos lados a la mitad. Es decir, si la suma ( no el valor absoluto ) de los dos números actuales es negativa, la variable de la izquierda se mueve hacia la derecha, y si es positiva, la variable de la derecha se mueve hacia la izquierda. ¡Solo toca el anillo!

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,a[1000010],mn=0x3fffff;
int main()
{
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
	}
	sort(a+1,a+n+1);
	//for(int i=1;i<=n;i++) cout<<a[i]<<' ';
	long long l=1,r=n,x,y;
	while(l<=r)
	{
		x=abs(a[l]+a[r]);
		y=a[l]+a[r];
		mn=min(mn,x);
		if(y<=0) l++;
		else r--;
	}
	cout<<mn;
	fclose(stdin);
	fclose(stdout);
    return 0;
}

110 artículos originales publicados · 100 alabanzas · vistas 8031

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/104826237
Recomendado
Clasificación