cuatro columnas

Título: cuatro columnas
que Italia: ZJM tiene cuatro columnas A, B, C, D, cada columna tiene el número de dígitos n. ZJM una serie tomada de cada número de la columna respectiva, le gustaría saber cómo muchos tipos de programas tales que el número de 4 y 0.
Cuando un número de columnas tiene la misma pluralidad de números, a tratarlos como un número diferente.
Por favor ayudarlo!

Entrada:
Primera línea: n (el número representa el número de dígitos en columnas) (1≤n≤4000)
la n-ésima fila siguiente, el i-ésimo fila de cuatro números, cada número de columnas A, B, C, D de el dígito i-ésima (dígito 2 a la potencia de no más de 28)

Salida:
salida de la serie de diferentes combinaciones.

Ejemplo:
Aquí Insertar imagen Descripción

Ideas de resolución de problemas: En primer lugar, pensar en la violencia, O (n4) violencia directa, entonces el tiempo de espera (manual divertido). A continuación, la optimización, podemos, primero A, B, y terminó a continuación, calcula y ordenadas en una matriz, de modo que el tiempo de complejidad es O (N2 logn2). Entonces buscar a C + D, seguido de dos minutos o O (N2 logn2), para encontrar el C + D opuesto de la posición de la A + B es, si hay incluso un resultado de ello, tal uso la mitad de la complejidad de tiempo de n2 * logn de , es aceptable.

código:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int a[4][4005];
vector<int> h,z;
int main()
{
    int n,x;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<4;j++)
        {
            cin>>x;
            a[j][i]=x;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            h.push_back(a[0][i]+a[1][j]);
        }
    }
    sort(h.begin(),h.end());//A+B排序
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            z.push_back(a[2][i]+a[3][j]);
        }
    }//C+D不用排序
    int total=0;
    for(int i=0;i<z.size();i++)
    {
        z[i]=-z[i];
        int l=0,r=h.size()-1;
        int ans=-1;
        while(l<=r)//找相反数二分
        {
            int mid=(l+r)/2;
            if(h[mid]>z[i])
            {
                r=mid-1;
            }else if(h[mid]<z[i])
            {
                l=mid+1;
            }else if(h[mid]==z[i])
            {
                ans=mid;
                l=mid+1;
            }
        }
        if(ans==-1)//没找到,白给
        {
            continue;
        }
        if(h[ans]==z[i])
        {
            total++;//找到
            for(int j=ans-1;j>=0;j--)//在这个数周围找找看有没有相同的
            {
                if(h[j]==z[i])
                {
                    total++;
                }else
                {
                    break;
                }
            }
            for(int j=ans+1;j<h.size();j++)
            {
                if(h[j]==z[i])
                {
                    total++;
                }else
                {
                    break;
                }
            }
        }
    }
    cout<<total<<endl;
}
Publicado 15 artículos originales · ganado elogios 0 · Vistas 225

Supongo que te gusta

Origin blog.csdn.net/qq_43653717/article/details/104858205
Recomendado
Clasificación