手袋_牛オフネットワーク

リンク:https://www.nowcoder.com/questionTerminal/365d5722fff640a0b6684391153e58d8?pos=2&orderByHotValue=0&done=0
出典:牛オフネットワーク

N色は色ごとに手袋点が左右、地下手袋に立っていたが、右手のグローブの数は必ずしも同じ。Aさんは、外出することになりましたので、彼は選手セットの地下に行っていました。しかし、彼は手袋の色を区別することができませんでした薄暗い光が、唯一の右の人を区別することができます。そこで彼は、いくつかのより多くの手袋を取得した後、手袋の同じ組に右腕の色を選択します。質問は今、彼は少なくとも手袋の色を選択することができます同じペアを確保するためには、(右から左プラス)手袋を持参どのように多くの、です。

与えられた色数N(1≤n≤13)の種の二つの与えられた長さnの配列は、左、右、左、右、それぞれ、手袋の各色の数を表しています。26よりもより多くないを確実にするために手袋の合計数に関するデータ、および少なくとも合法的なプログラムが存在しなければなりません。

試験サンプル:
  4、[0,7,1,6]、[1,5,0,6]
  戻り値:10(説明:利き手袋は、右のグローブ8を取り、2を取ることができます)
 
アイデア:満たすために、この手袋の手を手に手袋を選択:(合計 - 最小+ 1)、(総ので - 最小+ 1)が持っている各色の手を満たしている、のはもう一方の手を使ってみましょう質問の意味を満たすために、いずれかの手袋。
特別な場合:手は(A)が選択される特定のカラー手袋の数に起因して、1 + Bグローブ[カラー0の和として手袋]を取るべきである一方、(B)には、0である場合Bに手袋に一定の非ゼロの色を持っていることを確認します。
int型 FindMinimum(int型のn、ベクトル< int型 >左、ベクトル< 整数 > 右){
     // ここにコードを記述壁紙
    int型 SUM = 0 ;
     int型 leftSum = 0、rightSum = 0 ;
     int型 leftMin = INT_MAX、rightMin = INT_MAX;
     のためint型 = I 0、I <N - 、I ++ 
    { 
        IF(左[I] *右の[I] == 0 
            SUM + =(左の[I] + 右の[I]は); //の両手の和を計算します一つだけの色は、色の手袋合計数0、一方で
         それ以外は、
        { 
            leftSum + = 左の[I]。
            rightSum + = 右の[I]。
            leftMin = 分(leftMin、左の[I])。
            rightMin = 分(rightMin、右[I])。
        } 
    } 
    戻り和+分(leftSum-leftMin + 1、rightSum-rightMin + 1)+ 1 
}

 

 

おすすめ

転載: www.cnblogs.com/dabai56/p/10982841.html