抗最大限のアレイを取った後、1005 K回と
説明:
整数Aの配列を考えると、我々は次のような方法で、配列を変更することができます。私たちは、インデックスiとAを選択し、[I] -A [i]は、このプロセスは、K回の合計を繰り返しているに置き換えられます。(私たちは、私回以上同じインデックスを選択することができます。)
このように配列を変更した後、可能な最大の配列を返します。
例1:
入力:A = [4,2,3]、K = 1
出力:5
説明:(1)、次いでA [4、2,3]となるインデックスを選択します。
例2:
入力:A = [3、-1,0,2] 、K = 3
出力:6
説明:(1、2、2)インデックスを選択し、Aは、[3,1,0,2]となります。
例3:
入力:A = [2、-3、 -1,5、-4]、K = 2
出力:13
説明:のインデックス(1,4)、およびA [2,3を選択し、-1,5,4 ]。
ヒント:
1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A [i]が<= 100
1解決策1:96 MS 8.6 MB 2 クラスソリューション{ 3。 公共: 4 int型 largestSumAfterKNegations(ベクトル< INT >&A、int型K){ 5。 / * アイデア: 6 正とすることができる値の配列、負、k回否定、 7 、後に、小さな、フロント負、正の大きなアレイをソートする 8。 1:負の内部アレイ場合 9 1.1負の数> = Kは、それが負のk回反転させることができ、最終的な合計 10 1.2もし負の数<K、全てのその後数m負否定、残り時間キロメートル、 11 1.3再び、発注元の負は正となり、小さくてもよいので、例えば-10、-1、 4,5、 12 -1、次に最小となるので、リオーダー 13は、 同じインデックスiが複数回選択することができるので、その後、最初の非負を動作させます。 14 1.4は、現在の最小値を表す変数の定義ソートされない可能性が 15を 最初の正非負、次いで合計(キロ)%2 == 0であれば 16 、次いでIF(キロ)%2 == 1第非負数が合計され、負である 17。 2:正の整数、倍のランキング、最初非負数kとを合計した場合 18である * / 19 ソート(a.begin()、A .END()); 20は、 int型 CNT = 0 ; 21は 22である ため(INT I = 0 ; I <a.size(); Iは++ ){ 23が IF(CNT == K)BREAK ; 24 IF(A [I] <0 && CNT < K){ 25 A [I] = - A [i]は、 26 CNT ++ ; 27 } 他{ 28 ソート(A.begin()、A.end())。 29 であれば((K-CNT)%2 =!0){ // A [0]最小 30 A [ 0 ] = - A [ 0 ]。 31 32 } 33 ブレーク。 34 } 35 } 36 int型の和= 0 。 37 のために(INT iは= 0 ; I <A.size()は、i ++ ){ 38 の合計+ = A [i]は、 39 } 40 リターン和。 41 } 42 }。
1解決策2: 4つの MS 8.7 MB 2 クラスソリューション{ 3。 公共: 4 int型 largestSumAfterKNegations(ベクトル< INT >&A、int型K){ 5。 / * アイデア: 6 正とすることができる値の配列、負、k回否定、 7 、後に、小さな、フロント負、正の大きなアレイをソートする 8。 1:負の内部アレイ場合 9 1.1負の数> = Kは、それが負のk回反転させることができ、最終的な合計 10 1.2もし負の数<K、全てのその後数m負否定、残り時間キロメートル、 11 1.3再び、発注元の負は正となり、小さくてもよいので、例えば-10、-1、 4,5、 12 -1、次に最小となるので、リオーダー 13は、 同じインデックスiが複数回選択することができるので、その後、最初の非負を動作させます。 14 1.4は、現在の最小値を表す変数の定義ソートされない可能性が 15を 最初の正非負、次いで合計(キロ)%2 == 0であれば 16 、次いでIF(キロ)%2 == 1第非負数が合計され、負である 17。 2:正の整数、倍のランキング、最初非負数kとを合計した場合 18である * / 19 ソート(a.begin()、A .END()); 20は int型 = CNT 0 ; 21は、 intを最小= INT_MAX、ID = 0 ; //を変更する、最小を記録し、添字 22である ため(INT I = 0 ; I <a.size( ); I ++ ){ 23であります IF(CNT == K)BREAK ; 24 IF(A [I] < 0 && CNT < K){ 25 A [I] = - A [I]は、 26である CNT ++ ; 27 IF(最小> A [I]){ / / 最小添字更新 28 分= Aを[I]; 29 ID = I; 30 } 31である } 他 { // ソート(a.begin()、a.end()); 32 IF((K-CNT )%2!= 0){ //なる負及び正の最小値元々最初非負最小値比較 33で IF(最小<A [I])A [ID] = - A [ID]; // 最小人を確認するために 34である 他、Aは[I] = - A [I]は、 35 } 36 BREAK ; 37 } 38である } 39 のint SUM = 0 ; 40 用(INT I = 0 ; I <a.size(); I ++ ){ 41は、 SUM + = A [I ]; 42である } 43で 戻りSUM; 44である } 45 }。