Concurso para principiantes de AtCoder 178 F 题 解

Enlace de tema

Planteamiento del problema

Se dan dos secuencias A y B, ambas de longitud N. A y B están clasificadas en orden ascendente. Compruebe si es posible reordenar los términos de B de modo que para cada i (1≤i≤N) Ai ≠ Bi se cumpla, y si es posible, genere cualquiera de los reordenamientos que lo logren.
————————————————
Entrada La
entrada se proporciona desde la Entrada estándar en el siguiente formato:
N
A1 A2 ⋯ AN
B1 B2 ⋯ BN
————————————— ———
Salida
Si no existen reordenamientos que satisfagan la condición, imprima 'No'.
Si existe un reordenamiento que satisface la condición, escriba 'Sí' en la primera línea. Después de eso, imprima un reordenamiento de B en la segunda línea, separando los términos con un espacio en blanco.
Si hay varios reordenamientos que cumplen la condición, puede imprimir cualquiera de ellos.
————————————————
Entrada de muestra 1
6
1 1 1 2 2 3
1 1 1 2 2 3

Salida de muestra 1

2 2 3 1 1 1
————————————————
Entrada de muestra 2
3
1 1 2
1 1 3

Salida de muestra 2
No

Título

Dadas dos matrices de A y B que se han ordenado de pequeña a grande, si B se puede reemplazar arbitrariamente de modo que Ai no sea igual a Bi para cualquier i.

Ideas

Dado que se ha ordenado de pequeño a grande, primero invierta la matriz B y luego recorra de adelante hacia atrás. Si se encuentra lo mismo, busque si hay un número en la matriz B que se pueda intercambiar con este bit para hacer que existan dos números diferentes, si es que hay Intercambio, de lo contrario, el resultado no existe.

Código

#include<map>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
int n,ans,res,sit,a[maxn],b[maxn];
int main()
{
    
    
	//ios::sync_with_stdio(false);
    //cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>a[i];
    for(int i=n;i>=1;i--)
		cin>>b[i];
	for(int i=1;i<=n;i++)
	{
    
    
		if(a[i]==b[i])
		{
    
    
			bool flag=0;
			for(int j=1;j<=n;j++)
			{
    
    
				if(a[i]!=b[j]&&a[j]!=b[i])
				{
    
    
					swap(b[i],b[j]);
					flag=1;
					break;
				}
			}
			if(!flag)
			{
    
    
				cout<<"No"<<endl;
				return 0;
			}
		}
	}
	cout<<"Yes"<<endl;
	for(int i=1;i<=n;i++)
		cout<<b[i]<<" ";
	cout<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/WTMDNM_/article/details/108598446
Recomendado
Clasificación