AtCoderビギナーコンテスト178F题解

トピックリンク

問題文

与えられているのは、長さNの2つのシーケンスAとBです。AとBは、それぞれ昇順でソートされます。各i(1≤i≤N)に対してAi≠Biが成り立つようにBの項を並べ替えることが可能かどうかを確認し、可能であれば、それを実現する並べ替えを出力します。
----------------
入力
入力は、以下の形式で標準入力から与えられる:
N
A1 A2⋯AN
B1 B2⋯BN
------------- ———
出力
条件を満たす再注文がない場合は、「いいえ」と出力します。
条件を満たす並べ替えが存在する場合は、最初の行に「はい」と出力します。その後、2行目にBの並べ替えを印刷し、用語を空白で区切ります。
条件を満たす複数の並べ替えがある場合は、それらのいずれかを印刷できます。
————————————————
サンプル入力1
6
1 1 1 2 2 3
1 1 1 2 2 3

サンプル出力1
はい22
3 1 1 1
————————————————
サンプル入力2
3
1 1 2
1 1 3

サンプル出力2
いいえ

題名

小さいものから大きいものへと配置されたAとBの2つの配列が与えられた場合、AiがどのiについてもBiと等しくないようにBを任意に置き換えることができるかどうか。

アイデア

小さいものから大きいものへと並べ替えられたので、最初にB配列を反転してから、前から後ろにトラバースします。同じものが見つかった場合は、このビットと交換して2つの異なる番号を存在させることができる番号がB配列にあるかどうかを調べます。交換しないと、結果は存在しません。

コード

#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;
}

おすすめ

転載: blog.csdn.net/WTMDNM_/article/details/108598446