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;
}