タイトル効果:を有する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 " 、年)。 }