A. DIY木製のはしご
問題の意味:基づいて、エッジの2つの最長の辺から選択されるラダーを取り、ステップ、およびステップ基部側が数よりも小さい場合、他の側を選択します。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 10 。 int型のmain() { IOS :: sync_with_stdio(偽); int型T; CIN >> T; 一方、(T-- ){ int型N。 cinを >> N; INT [MAXN]。 以下のために(int型 i = 0 ; iがn <; iは++ ){ CIN >> [I]。 } ソート( +のN)。 int型フラグ= [N- 2 ] - 1 。 もし(N 2 > = フラグ){ COUT <<フラグ<< ENDL。 } 他 COUT << N- 2 << ENDL。 } 戻り 0 。 }
B.の柱
問題の意味は:プレートを移動させる、全積層のN位置、半径AIプレートの各位置は、移動条件が満たされているかどうかを決定する:> J、ABS(IJ)== 1、我々が位置を有しますI-食器、Jか、または私より大きい半径に。
思考:記録位置の最大半径、最大半径の位置が移動し、側面よりも小さい最大半径、(特にない同じ半径、及び1-n)を見つけることができません
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 2E5 + 100 。 int型のmain() { IOS :: sync_with_stdio(偽); INT [MAXN]。 int型のn; cinを >> N; int型のフラグ。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> [I]。 もし([I] == N){ フラグ = I。 } } INT CNT = N- 1、L = FLAG- 1、Rフラグ= + 1 。 一方(CNT> 0 ){ 場合(L> 0 && [L] == CNT) { L - 。 CNT - ; } 他の 場合(R <= N && [R] == CNT) { R ++ 。 CNT - ; } 他に { 、CNT = - 2 ; 破ります; } // COUT << "L =" << L << "R =" << R << "CNT" << CNT << ENDL。 } であれば(CNT == - 2 ) COUT << " NO " << ENDL。 他の裁判所未満<< " YES " << てendl; リターン 0 ; }
C.アレイを分割
問題の意味:数nとk個のサブセットに分割することが昇順ソート、最大値と最小値と、この最小値の差を計算するすべての部分集合を有します。
アイデア:1サブセットの数は、この差は、n kの分割数、K-1は、NKサブ1の数数のサブセットでない場合場合、ゼロであります最小セット、コンピューティングアレイは二十から二差ソート場合、答えは最小であり、NK前。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 3E5 + 100 。 int型のmain() { IOS :: sync_with_stdio(偽); INT [MAXN]。 int型N、K。 CIN >> N >> K。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> [I]。 } int型B [MAXN]。 以下のために(int型 i = 1 ; iがn <; iは++ ){ B [i]は = [I + 1 ] - [I]。 } ソート(B + 1、B + N)。 int型の合計= 0 ; 以下のために(int型私= 1 ; I <= NK、iが++ ) { 合計 + = B [i]は、 } COUT <<和<< ENDL。 }