2021-03-22:XiaohuはAppleを買いに行きます、店は2つのタイプのビニール袋だけを提供します、それぞれのタイプは任意の数を持っています。1.6を保持できます

2021-03-22:XiaohuはAppleを買いに行きます、店は2つのタイプのビニール袋だけを提供します、それぞれのタイプは任意の数を持っています。1.りんご6個入りのバッグ2.りんご8個入りのバッグ。Xiaohuは、リンゴを入れるために2種類のバッグを自由に使用できますが、Xiaohuは強迫性障害を抱えており、使用するバッグの数を最小限に抑え、使用するすべてのバッグをいっぱいにする必要があります。正の整数Nが与えられた場合、少なくとも使用されているバッグの数を返します。Nが使用する各バッグを満杯にすることができない場合は、-1を返します。

2021年3月22日のフーダの答え:

1.自然の知恵で十分です。
Nは2の倍数でなければなりません。そうでない場合、6と8の最小公倍数は2であるため、2つのバッグは常に不満になります。
最初にすべての袋を8番の袋に入れ、残りのリンゴを6番の袋に入れます。6番は満足できません。6番の袋がいっぱいになるまで8番のリンゴを6番の袋に注ぎます。

2.結果に基づいて結果を逆にし、ルールを見つけます。
Nは2の倍数でなければなりません。そうでない場合、6と8の最小公倍数は2であるため、2つのバッグは常に不満になります。
Nが18以上の場合、18から始まり、8つの数字のグループ。
Nが18未満の場合、結果は直接与えられます。

コードはgolangで記述されており、コードは次のとおりです。

package main

import "fmt"

func main() {
    for apple := 100; apple <= 120; apple++ {
        fmt.Println(apple, " : ", minBages1(apple), " : ", minBages2(apple))
    }
}
func minBages1(apple int) int {
    if apple < 0 {
        return -1
    }
    bag8 := apple / 8
    rest := apple - bag8*8
    for bag8 >= 0 {
        // rest 个
        if rest%6 == 0 {
            return bag8 + (rest / 6)
        } else {
            bag8--
            rest += 8
        }
    }
    return -1
}
func minBages2(apple int) int {
    if (apple & 1) != 0 { // 如果是奇数,返回-1
        return -1
    }
    if apple < 18 {
        if apple == 0 {
            return 0
        }
        if apple == 6 || apple == 8 {
            return 1
        }
        if apple == 12 || apple == 14 || apple == 16 {
            return 2
        }
        return -1
    }
    return (apple-18)/8 + 3
}

実行結果は以下のとおりです。
ここに画像の説明を挿入します


神のJavaコードコメントを残しました

おすすめ

転載: blog.51cto.com/14891145/2668704
おすすめ