Codeforces Round # 623 (Div.2) C. Restauración de la permutación

Se le da una secuencia b1, b2,…, bn. Encuentre la permutación lexicográficamente mínima a1, a2,…, a2n tal que bi = min (a2i − 1, a2i), o determine que es imposible.

Entrada
Cada prueba contiene uno o más casos de prueba. La primera línea contiene el número de casos de prueba t (1≤t≤100).

La primera línea de cada caso de prueba consta de un número entero n: el número de elementos en la secuencia b (1≤n≤100).

La segunda línea de cada caso de prueba consta de n números enteros diferentes b1,…, bn - elementos de la secuencia b (1≤bi≤2n).

Se garantiza que la suma de n por todos los casos de prueba no exceda de 100.

Salida
Para cada caso de prueba, si no hay una permutación adecuada, imprima un número -1.

De lo contrario, imprima 2n enteros a1,…, a2n - se requiere una permutación lexicográficamente mínima de números de 1 a 2n.

Ejemplo de
entrada
5
1
1
2
4 1
3
4 1 3
4
2 3 4 5
5
1 5 7 2 8
salida
1
2-1
4 5 1 2 3
6-1
1 3 5 6 7 9 2 4 8 10

El significado de la pregunta: déle una matriz b de n números y pregunte si hay una disposición a de 1 a 2 * n que satisfaga b [i] = min (a2i-1, a2i)

Idea: En primer lugar, por el significado de la pregunta, sabemos que debe haber 1 en esta secuencia, y luego marque cada número que aparezca, y luego encuentre la combinación correspondiente de la matriz b a su vez, 1 a 2 * n debe aparecer solo una vez

Código AC:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100010],b[100010],v[100010],c[100010];
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n,f=0;
        cin>>n;
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
            {
    
    
                cin>>a[i];
                v[a[i]]=1;
                if(v[a[i]]>1)f=1;
            }
            if(v[1]==0)f=1;                                                                                 
        int tot=1;
        for(int i=1;i<=n;i++)
        {
    
    
            c[tot++]=a[i];
            while(v[a[i]])
                {
    
    
                    a[i]++;
                    if(a[i]>2*n)
                        f=1;
                }
            c[tot++]=a[i];
            v[a[i]]=1;
        }
        if(f)
        {
    
    
            cout<<-1<<endl;
            continue;
        }
        for(int i=1;i<=2*n;i++)
            cout<<c[i]<<" ";
        cout<<endl;

    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43244265/article/details/104525749
Recomendado
Clasificación