非常に明白貪欲であると思われます
まず、当然のことながら、同じ場所の二つ以上に一度、各為替スワップをしようとします
その
優先度の$ \は{bmatrix} \\ B \端{bmatrix} $を開始し、$ \は\\ Bの\端{bmatrix} $交換{bmatrix}を始めます
優先度の$ \は{bmatrix} B \\ \端{bmatrix} $と$ \ {bmatrix} B \\ \端を開始する開始{bmatrix} $交換
最後に、残りの$ \は{bmatrix} \\ Bの\端{bmatrix} $、$ \開始{bmatrix} B \\ \端{bmatrix} $各A始める場合
我々は、彼らが良い仕事をする交流の二倍の数を使用する必要がありましたので、最高です
もちろん、最後は状況の特定の種類を、残りの場合は、それを別のケースを持っていません
それは何の解決策ではありませんし、それを維持するために、コードの特定を見て
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - '1 ; CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 4E5 + 7 。 int型nは、PA、PB; チャーA [N]、B [N]。 ベクター < INT > ANS [ 2 ]。 INT ()は、メイン { N =読み取ります()。scanf関数(" %sの"、A + 1); scanf関数(" %sの"、B + 1 )。 以下のために(int型 i = 1 ; iが<= N; iは++ ) { 場合([I] == B [i])と続けます。 もし([I] == ' ' ) { もし PA =(PA!)I。 他 ANS [ 0 ] .push_back(PA)、ANS [ 1 ] .push_back(I)、PA = 0 。 } 他 { 場合(PB!の)PB = I; 他の ANS [ 0 ] .push_back(PB)、ANS [ 1 ] .push_back(I)、PB = 0 。 } } もし、((PA && PB)||(PA && PB)!){のprintf(" -1の\ n "); リターン 0 ; } であれば(PA && PB){ANS [ 0 ] .push_back(PA)。ANS [ 1 ] .push_back(PA)。ANS [ 0 ] .push_back(PA)。ANS [ 1 ] .push_back(PB)。} INT LEN = ANS [ 0 ] .size()。 printf(" %d個の\ n " 、LEN)。 以下のための(int型 I = 0を printfの(私は++;;私はLEN <)」%D%D \ n "、年[ 0 ] [i]は、年[ 1 ] [I]); 戻り 0 ; }