Cuatro columnas: la determinación de las cuatro columnas tomadas y el número de tipos de programas para el número total 0. c ++

cuatro columnas

Hay cuatro columnas A, B, C, D, cada columna tiene el número de dígitos n. Un número tomado de cada número de la columna respectiva, a preguntar cómo muchos de esos programas y el número 4 es de 0.
Cuando un número de columnas tiene la misma pluralidad de números, a tratarlos como un número diferente.

De entrada de la primera fila: n (número representativo del número de columnas) (1≤n≤4000)
la n-ésima fila siguiente, el i-ésimo fila de cuatro números, cada uno representa el número de columnas A, B, C, D de i dígitos (dígito 2 a la potencia de no más de 28)
el número de salida de diferentes combinaciones

entrada de la muestra:
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45

salida de la muestra:
5

(Respuesta: (- 45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46), (--32, 30, -75, 77) , (-32, -54, 56, 30)

ideas:

  • Una primera fuerza de reacción, puede ser calculado a partir de todo el ciclo resultados cuarteto, igual a 0 +. Pero tal es la complejidad de la N- 4 , sin duda será explosivo.
  • Por lo tanto, los intentos de utilizar pensamiento binario, se puede enumerar A + B y C + D, respectivamente, los resultados para cada uno de C + D, para averiguar si tiene la opuesto de la A + B.
  • Si la violencia directa de encontrar en el A + B en el caso, la complejidad y no mucho más baja, puede primera respuesta a A + B están ordenadas, y luego continuar a utilizar la idea binaria para encontrar, posiciones numéricas bloqueo opuestas (utilizar una búsqueda binaria primera número y ubicación frente a una posición opuesta al último número, la posición del último - en una primera posición opuesta a la + 1 = el número de veces de apariencia)
#include<algorithm>
#include<cmath> 
#include<vector>
#include<iostream>
using namespace std;
int a[1000001];
int b[1000001];
int c[1000001];
int d[1000001];
vector<int>ab;
int findbegin(int x)
{
	int l=0,r=ab.size()-1,ans=-1;
	while(l<=r)
	{
		int m=(l+r)/2;
		if(ab[m]==x)
		{
			ans=m;
			r=m-1;
		}
		else if(ab[m]>x)	r=m-1;
		else l=m+1;
	}
	return ans;
}
int findend(int x)
{
	int l=0,r=ab.size()-1,ans=-1;
	while(l<=r)
	{
		int m=(l+r)/2;
		if(ab[m]==x)
		{
			ans=m;
			l=m+1;
		}
		else if(ab[m]>x)	r=m-1;
		else l=m+1;
	}
	return ans;
}
int main()
{
	int n;
	cin>>n;
	int ans=0;
	for(int i=0;i<n;i++)
	{
		
		cin>>a[i]>>b[i]>>c[i]>>d[i];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			ab.push_back(a[i]+b[j]);
		}
	}
	sort(ab.begin(),ab.end());
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			int temp=(c[i]+d[j])*(-1);//枚举c+d,若互为相反数则确定是一组 
			int l=findbegin(temp);
			int r=findend(temp);
			if(l!=-1) ans+=(r-l+1);
		}
	}
	cout<<ans<<endl;
	return 0;
}
Publicado 29 artículos originales · ganado elogios 1 · visitas 943

Supongo que te gusta

Origin blog.csdn.net/qq_44654498/article/details/104926493
Recomendado
Clasificación