彗星OJ - コンテスト#10 Bタイトルの美しさ

###トピックのリンク###

 

タイトル効果:を有するnは正の整数、句、慣用句と同じ正の整数を表す各正の整数。3回だけ表示され、最大の正の整数。

このように、最大​​間隔同じイディオム最小、最小間隔の出力の最大値をそのような配置を求めます。

熟語の数と同じ間隔が中間その間にイディオム。

特に、各フレーズは一度だけ登場したときに、最小間隔の最大値が考慮さ  N- 

 

分析:

1、イディオムの最大数は2:00で発生した場合:例えば、2つの異なるイディオム12があり、それらは最小間隔を最大とすることができるようにするために、最良の構造は、2つの1の2つの間隔に等しい、二回登場しています2区間。

       1 2 1 2 XXXXX(他のイディオムの代わりにX)

ですから、イディオムが二回登場させることができ、その間隔が小さくを持たない、同じです。その後、RESが=イディオムの数は一度だけ表示させ、イディオムの2種類の番号を設定=起こります。

RES = N - 2 *、答えは:RES +(A - 1) 。

 

2、その後、フレーズが数2の場合は表示されません、数は3であるが現れ、そのように構成することができます。   

1 2 3 1 2 3 XXX XX 1 2 3

あなたはX(X = 5)は、両側のためのサブ・アカウントので、最小123間隔3つのイディオムは、確かに少ない側面を持っている、これが奇数であることを、同じであることがわかりますのでので、少しこちら側の最小間隔です。

RES =イディオムのセット数はかつて、イディオムの種類の数=が3回表示されます表示されます。RES = N - 3 *、答えは:RES +( - 1) 。

 

3、 2回の両方のイディオムの他の3回の出演のために、あなたはまた、イデオロギー的な構造の上に使用することができます。

最大の間隔を最小限にし、ためにするために、イディオムは、ほとんどの真ん中に好ましくは右端の左端の1で3回、表示されますので。制限なし「中央3イディオム」がないので、フレーズのため、2回出現したよう、そして間隔のイディオムの数を増加させるために3回表示され、最良の方法は最高の右側の3つのイディオムに残されて表示され水切りした後、イディオムは、行で唯一の二回表示されます。

例えば、それは3回登場している:123、45で二回表示されます。

1 2 3 4 5 1 2 3 XX XXX 4 5 1 2 3

最大および1,2および2,3および3の最小の間隔を確保することができる限り小さいが(同じ間隔である二つに対して同じであるイディオム)が最小間隔と同じであるような

しかし、制限のアイデアがあります:イディオム番号の多くは、彼らが近い真ん中に移動する必要がさせる、二回表示された場合、外観のイディオムが2倍未満の間隔間隔というフレーズになりますことがあり、その後、同時に求めて、3回表示され、どこへ行く分。

RES =イディオムのセット数はかつて、イディオムの種類のX =数は、二度yと表示されます=イディオムの種類の数が3回表示されます表示されます。

あり:RES = N - 2 * X - 3 * Y、 答えは:(RES X + Y + -分。1、RES / 2 + X + Y - 1)

HHH minが、これはそれが式から分かるように、実際には役に立たないで、右は(イディオム三の最小間隔を表示)(二イディオムの最小間隔が表示され)、左よりも小さくなります。

 

その後、多くのデータ以来、イディオムの数が開いマップまたは離散しない限り、表示され記録されます。

コードは以下の通りであります:

 

書式#include <iostreamの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
int型のn;
INT [ 100008 ]、B [ 100008 ]、C [ 100008 ]、VIS [ 100008 ]。
int型のmain()
{ 
    scanf関数(" %のD "、&n)を。
    以下のためにINT iが= 1 ; <I = N; I ++ ){ 
        scanf関数(" %のD "、および[I])。
        B [I] = [I]。
    } 
    ソート(B +1、B + N + 1 )。
    INT LEN =一意(B + 1、B + N + 1) - B - 1 以下のためにINT iが= 1 ; <I = N; I ++)C [I] = LOWER_BOUND(B + 1、B + LEN + 1、[I]) - B、VIS [C [I]] ++; // 离散化
    INT X = 0、Y = 0 以下のためにINT iが= 1 ; I <= LEN; I ++ ){
         場合(VIS [I] == 2)x ++ それ以外の 場合(VIS [I] ==3)Y ++ 
    } 
    int型の解像度、ANS。
    もし((X)&&(!Y)){ 
        ANS = N。
    } 
    そう であれば(X &&(!Y)){ 
        RES = N - 2 * X。
        ANS = RES + X - 1 
    } 
    そう であれば((X)&&!Y){ 
        RES =(N - 3 * Y)/ 2 
        ANS = RES + Y - 1 
    } 
    { 
        RES = N -2 * X - 3 * Y。
        // ANS =分(RES + Y + X - 1、RES / 2 + X + Y - 1)。
        年間= RES / 2 + X + Y - 1 
    } 
    のprintf(" %dの\ n " 、年)。
}

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/Absofuckinglutely/p/11887389.html