ベスト牛ラインPOJ - 3617(貪欲辞書順最小の問題)

FJは、毎年恒例の「ファーマー年の」競争に彼のN(1≤N≤2000)牛を取るしようとしています。このコンテストでは、すべての農家は、ラインに彼の牛を配置し、群れそれら判断過去。
コンテストの主催者は今年、新たな登録制度を採用した:(FJは、彼はちょうどBSDを登録しているために、ベッシー、シルビア、およびドラを取る場合、すなわち)単に彼らが表示されます順番にすべての牛の頭文字を登録します。登録段階が終了した後、各グループは、牛の名前の頭文字の文字列に従って辞書式順序を増やすに判断されます。
FJは、今年は非常に忙しいですし、彼は可能な限り早期に判断したいので、彼の農場に戻って急いでする必要があります。彼は、それらを登録する前に、すでに並んでいる彼の牛を、再配置することを決定します。
FJマーク競合牛の新しいラインのための場所。彼はその後、繰り返し、新規行の末尾に元の行(の残り)のいずれかで最初または最後の牛を送信して新しいものに古いラインから牛をマーシャリングへ進みます。彼が終了しています場合は、FJは、この新しい順で登録のための彼の牛を取ります。

彼の牛の最初の注文を考えると、彼はこの方法を行うことができますイニシャルの少なくとも辞書式の文字列を決定します。
入力
* 1行目:単一の整数:N
元のラインのi番目の位置における牛の回線I + 1は、単一の初期(「A」...「Z」)を含有する:*行2 ... N + 1
出力
少なくとも辞書彼が作ることができます文字列。(おそらく最後のものを除く)すべての行は、新しい行に(「A」...「Z」)80頭の牛のイニシャルが含まれています。

サンプル入力

6
A
C
D
B
C
B

サンプル出力

ABCBCD

ここに画像を挿入説明

問題の解決策は、
各時間は、最終的な配列の文字列辞書が最小化されるように、ヘッド部から文字または文字列の末尾を取ります。

文字入力は、文字入力であることに注意してください!
使用getchar関数()スロー簡単タイムアウトランタイムは、入力は文字入力、ノートラップ、缶のscanf( "\ n個%のC"であってもよい 、&​​Sを[I]);

コードこれで次の見て!

#include<stdio.h>
char s[2010];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i,head,tail;
        for(i=0; i<n; i++)
        {
            scanf("\n%c",&s[i]);    
        }
        head=0;
        tail=n-1;
        int flag,s1=0;
        while(head<=tail)
        {
            flag=0;
            for(i=0; head+i<=tail; i++)
            {        //第一个字符与最后一个字符比大小,依次对称比较
                if(s[head+i]<s[tail-i])  
                {
                    flag=0;
                    break;
                }
                else if(s[head+i]>s[tail-i])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
                printf("%c",s[head++]);
            else
                printf("%c",s[tail--]);
            s1++;
            if(s1==80)
            {
                printf("\n");
                s1=0;
            }
        }
        printf("\n");
    }
    return 0;
}
リリース7件のオリジナルの記事 ウォンの賞賛1 ビュー60

おすすめ

転載: blog.csdn.net/Piink/article/details/105128275