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
}
実行結果は以下のとおりです。