Regalo misterioso de la semana 4 C TT

Descripción del título:

Dada una matriz de N números cat [i], y use esta matriz para generar una nueva matriz ans [i]. La nueva matriz se define como para cualquier i, j e i! = J, todos tienen ans [] = abs (cat [i] -cat [j]), 1 <= i <j <= N. Intente encontrar la mediana de esta nueva matriz. La mediana es el número correspondiente a la posición (len + 1) / 2 después de la clasificación, y '/' se redondea hacia abajo.

Ingrese:

Múltiples conjuntos de entradas, cada vez que ingresa un N, lo que indica que hay N números, luego ingrese una secuencia cat de longitud N, cat [i] <= 1e9, 3 <= n <= 1e5.

Entrada de muestra:

4
1 3 2 4
3
1 10 2

Salida:

Salida de la mediana de la nueva matriz ans

Salida de muestra:

1
8

Ideas:

Para la secuencia cat de entrada, podemos conocer el tamaño de la matriz procesada a través de la secuencia aritmética de la suma de números de diferencia, de modo que podamos conocer la clasificación mediana requerida, y podemos saber la cantidad de números más pequeños que la mediana.
Ordenamos la secuencia del gato en orden ascendente, entonces la matriz ans se puede obtener restando el número anterior del último número, de modo que se pueda eliminar el valor absoluto, y también podemos dar el rango de la mediana, es decir, 0 a cat [n] -cat [1]
Debido a que la respuesta es monotónica, podemos considerar el método de dicotomía, dicotomizar el rango de la mediana y luego clasificarlo contra la mediana de acuerdo con el número P obtenido por la dicotomía. En la primera mitad, continúa dividiendo la primera mitad, de lo contrario la segunda mitad.
El último problema es determinar cuántos números son menores que P. Recorremos i para encontrar el rango de J. El número de datos menor que P se puede obtener como suma, y ​​también podemos encontrar el número de datos igual a P como igual. Recuerde que la clasificación mediana es m, si suma <m && (igual + suma)> = m, significa que P es la mediana, si igual + suma <m significa que P es menor que la mediana, entonces continúe la segunda mitad del rango mediano Si P es mayor que la mediana, continúe la primera mitad de la dicotomía hasta obtener la mediana.

Código:

#include <iostream>
#include <algorithm>

using namespace std;

int find(int *v,int x,int n,int i)
{
	int l=i,r=n,ans=-1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(v[mid]<x)
		{
			ans=mid;
			l=mid+1;
		}
		else
			r=mid-1;
	}
	return ans;
}

int main()
{
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		int *input = new int[n+1]();
		for (int i = 1; i <= n; i++)
			scanf("%d",&input[i]);
		sort(input + 1, input + n + 1);
		int l = 0, r = input[n] - input[1], mid = 0, m = ((n - 1)*n / 2 + 1) / 2, sum;
		while (l <= r)
		{
			int equal=0;
			sum=0;
			mid = (l + r) >> 1;
			for (int i = 1; i <= n; i++)
			{	
				int temp= find(input,input[i]+mid,n,i);
				if(temp!=-1)
				{
					for(int j=temp+1;j<=n&&input[j]==(input[i]+mid);j++)
						equal++;	
					sum += temp-i;
				}
				else
					for(int j=i+1;j<n&&input[j]==(input[i]+mid);j++)
						equal++;	
			}
			if(sum<m&&(equal+sum)>=m)
				break;
			else if(equal+sum<m)
				l=mid+1;
			else
				r=mid-1;
		}
		cout << mid << endl;
	}
    return 0; 
}
32 artículos originales publicados · elogiados 0 · visitas 687

Supongo que te gusta

Origin blog.csdn.net/qq_43814559/article/details/104979036
Recomendado
Clasificación