Codeforces 1368D AND, OR y suma cuadrada

Codeforces 1368D AND, OR y suma cuadrada

Discusión del algoritmo

La idea inicial es muy simple, es decir, puede ordenar todos los números de mayor a menor, y luego considerar cada número de izquierda a derecha sucesivamente, a la iiPara el número de i , es concebible considerar el orden inferior del orden superior, si es1 11 salto, si es0 00 Entonces definitivamente intenta hacer esto1 11. ¿Cómo se puede maximizar? Considere el siguiente bit como1 1El número 1 es un conjunto, luego el conjunto esOR ORcon este númeroSe deja el número más grande después de O R. Al principio pensé si haría que se hiciera más pequeño. Descubrí que si es más pequeño, entonces el número más pequeño será1 11 todavía puedo compensarlo. Si lo mira con atención, puede encontrar que puede contar el número de cada bit, y luego todos los1 11 fila arriba,0 0La fila 0 hasta la parte inferior es similar al sub-hijo del tipo de escalera de fila en la generación de línea, y la respuesta se puede mantener al final.

Implementación de algoritmos

int n,cnt[25];
int main()
{
    
    
    cin>>n;
    for(int i=1,x;i<=n;i++){
    
    
        cin>>x;
        int tot=0;
        while(x){
    
    
            if(x&1)cnt[tot]++;
            tot++,x>>=1;
        }
    }
    ll ans=0;
    while(233){
    
    
        ll tmp=0,base=1;
        int maxx=-1;
        for(int i=0;i<20;i++){
    
    
            if(cnt[i])tmp+=base,cnt [i]--;
            base<<=1;
            if(cnt[i])maxx=max(maxx,i);
        }
        ans+=tmp*tmp;
        if(maxx==-1)break;
    }
    cout<<ans<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhouzi2018/article/details/107178384
Recomendado
Clasificación