【レース】NOIPアナログ変換キュー

--- ---復元コンテンツ始まります

タイトル説明

彼らは今、長方形のn行n列に配置されているいたずらなクラス、体育の授業があります。誰もが先生のためではなく、左または右のために。例えば: 

RLR 

RRL 

LLR 

先生は新しいですので、私は学生の名前を口ことができませんでした。彼は、列または行に移動するたびに叫んだ:引き返します。すべてのL上の行または列がRなり、Rは、全てのL.なります いないすべての学生が一つの方向にあるため、次善の体育教師ので、彼は人に別の人の反対方向を可能にすることができます。体育教師の指示は制限されていない、彼はまた、繰り返し同じ行または列の受注を発行することができます。そのような学生を見つけてください。最終的には、その後、逆方向に一つだけの学生や他のことができない場合は「-1。」学生は、出力行と列番号(1から始まる)であるプログラムが存在する場合。各種プログラム、学生の行番号は、行座標場合より多くの学生が等しい最小出力、数値最小の一方の出力列がある場合。 

エントリー

ファイル名transitioning.inを入力します。 

Nを表す第1のライン整数。 

n文字のn行に続いて、各文字は、LまたはRです。 

輸出

出力ファイル名transitioning.out。 

出力ファイルは一行だけで、その厄介な学生の行と列の番号を示しています。 
ない場合は、出力-1。

サンプル入力のコピー

3 
RLR 
RRL 
LLR

サンプル出力のコピー

1 1



質問いくつかの貪欲な戦略を使用します。私たちは、チームは統一しようとしなければならないとは思いません。例を参照して、説明はRまたはL調整に関係なく、図の説明する、ある1の残りの部分であり、

チームはたった一人だけRに調整することができた場合は、残りはLです、その後、チームはまた、唯一の人工L、残りの人工R.に調整することができます そこで、我々は唯一の人工R.に加えて、Lに調整したすべてのチームである状況を考えます

だから我々は念を議論する必要があります。これは貪欲アルゴリズムが、貪欲な考え方に属してはいけません。だから私は、その後、「悪い生徒」を尋ねた質問には、前に表示されるようにしようと、私たちは左右の調整から、トップに持って貪欲な思考です。

例えば、最後の行から開始し、我々は「列反転」操作を使用し、全体の最後の行はLとなります。それはラインと他のライン混沌の背面につながるので、もはや、ケースを他の線を「列が否定」した後、最後の行に注意してください。

文字の各行の以下を確認するために底部から他の行を考慮するために、1に等しくありません。もしそうであれば、それは学生の位置ということである(銀行が否定することができますので、ここでは必ずしも必要では少ない文字は、Lではありません)。行の文字以下ならば、二人はあったか2行以上は矛盾表示され、またはすべての行が同じで、それが出力されるべき-1。

同様に、動作開始から最後の一つが実現可能である、ここではそれらを繰り返すことはしません。

コードを添付

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define MAXN 1005
 int型のn;
チャーS [MAXN] [MAXN]。
int型のCNT [MAXN]。
int型ansx、ansy、CNTR。
int型cntx、miny1、miny2。
INT メイン()
{ 
    // freopenは( "transitioning.in"、 "R"、STDIN)。
    // freopenは( "transitioning.out"、 "W"、STDOUT)。
    scanf関数(" %のD "、&N)
    int型 iは= 1 ; iが<= N iが++ 
        のscanf(" %sの"1 );
    INT J = 1 ; J <= nであり、j ++ 
    { 
        もし、(S [n]は[J] == ' R ' 
            CNT [J] ^ = 1 ; 
    } 
    のためのint型 I = N- 1、I> = 1 ; i-- 
    { 
        CNTR = 0 INT J = N; J> = 1 ; j-- もし(S [I] [J] == ' R ' && CNT [j] == 0 || S [I] [J] ==' L ' && CNT [J] == 1 
                CNTR ++、miny1 = J。
            
                miny2 = J;
        もし(CNTRの== 0 || CNTRが== n)を 
             続けます
        { 
            場合(MIN(N-CNTR、CNTR)== 1 
            { 
                場合(cntx> 0 
                { 
                    のprintf(" -1 N \ " )。
                    リターン 0 ; 
                }
                他の
                { 
                    ansx = I;
                    もし(CNTR == 1)ansy = miny1。
                     ansy = miny2。
                    cntx ++ ; 
                } 
            } 
            
            { 
                のprintf(" -1の\ n " );
                リターン 0 ; 
            } 
        } 
    } 
    もし(ansx == 0 && ansyの== 0 
        のprintf(" -1 \ nは" );
     
        のprintf(" %D%D \ n " 、ansx、ansy);
     戻り 0 ; 
}
コードの表示

新しいブロガーは、また、多くの注目を願っています!

おすすめ

転載: www.cnblogs.com/Enderman/p/11362495.html