ロス・バレーP1149のマッチ棒の方程式 - のPythonとアルゴリズムの問題を書きます

タイトル

元のタイトル

P1149のマッチ棒の方程式、https://www.luogu.org/problem/P1149

タイトル説明

あなたのマッチ棒nは、フォーム「A + B = C」の数は、あなたは、方程式を綴ることができますか?(非ゼロの数は、次に最上位ビット00がない場合)の式Aは、B、Cは、マッチ棒スペル有する整数です。スペルマッチ棒で0-90-9の戦いを示します:

注意:

  1. 彼らのニーズと等号2本のマッチ棒プラス
  2. もし≠B、その後、A + B = CとB + A = Cとして異なる式を(A、B、C> = 0)
  3. nはマッチ棒はすべて費やす必要があります

入力形式

整数N(N <= 24)。

出力フォーマット

異なる方程式の整数をもたらすかもしれません。

サンプル入力と出力

例1:

输入

14

输出

2

サンプル2

输入

18

输出

9

ソリューション

方法1:暴力と戦うためのテーブルの方法

Nの最大値はわずか24であるので、あなたは徹底的から直接答えることを進めることができます。

# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]


# 输入一个数,计算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c


result = [0] * 24

for n in range(10, 25): #10根火柴以下都是0,很明显
    print("caculate ", n)
    for i in range(0, 10000): #假设单个数字最大值为10000
        for j in range(0, 10000):
            if count(i) + count(j) + count(i+j) == n - 4:
                result[n-1] += 1
print(result)

私のコンピュータ上のコードが出て取得することはできません長い時間のために、最大値は2000に変更することができました。すぐに同じJavaのコードやPythonはこの種の問題に適していないことを示すのに十分な結果。

public class Test {
    public static void main(String[] args) {
        int[] result = new int[24];
        for(int i = 10; i <= 24; i++) {
            for(int j = 0; j < 10000; j++) {
                for(int k = 0; k < 10000; k++) {
                    if(count(j) + count(k) + count(j+k) == i - 4) {
                        result[i] += 1;
                    }
                }
            }
        }
        for(int i = 0; i < 24; i++) {
            System.out.println(result[i]);
        }

    }
    public static int[] num = {6,2,5,5,4,5,6,3,7,6};
    public static int count(int x) {
        if(x == 0) {
            return 6;
        }
        int c = 0;
        while (x > 0) {
            int digit = x % 10;
            c += num[digit];
            x = x / 10;
        }
        return c;
    }
}

最終結果は、{0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65あります88128}。

暴力は徹底的ですが、上記のコードに問題があるものの、しかし、まだ非常に遅いですPythonであるが、すべての時間をカウントライン上でカウントするように早起き保存するためのコールを繰り返したが、結果は許容時間内とすることができます。

# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]


# 输入一个数,计算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c


COUNT = [0] * 20000
for i in range(0, 20000):
    COUNT[i] = count(i)

result = [0] * 24

for n in range(10, 25):
    print("caculate ", n)
    for i in range(0, 10000):
        for j in range(0, 10000):
            if COUNT[i] + COUNT[j] + COUNT[i+j] == n - 4:
                result[n-1] += 1
print(result)

方法2:上記の方法の最適化

何より良い方法はありません、我々は、単一の最大数は、それを行うには良いだろうかどうかを知るために、加えて、サイクル数を最小限に抑えることができます。

マッチ棒の最小と最大数を綴るために、999の小さな1111よりも確かに良く、少なくとも2つのマッチの数ので、試合の数が偶数のためので、戦うために使用しなければならないので、その優先順位は、最大桁数を綴る必要があります11111は、最大値として、例えば10一致する、11111,20を綴ることができる最大数が一致する、最大数は1111111111である綴ることができます。

残りの10 + 8は、二分割不可能プール二つ10000超える、10,000以上の最大値を仮定すると、少なくとも10こと、11111を綴ることができ、それは10000の最大値を超えません。

9111を綴ることができ、残りの8は、この数まで追加することができない、少なくとも12、)9000,10000 [最大値が位置することができると仮定すると。

)最大は、[8000,9000を配置することができると仮定すると、少なくとも13、より不可能。

唯一のルート場合,,残りの11 9 + 2,2に、すなわち7111、少なくとも9、最大[7000、8000)に配置することができると仮定すると、それは7110であることが9を構成し、その数は十分ではありません。

少なくとも12、最大値は、[6000、7000)に配置することができると仮定し、また残りの8。

最大残りの4桁が9、少なくとも11、最大値は、[5000、6000)に配置することができると仮定すると、7000または1XXXを綴ることができる5000まで追加することができません。同じことは[2000、5000)のために行きます。

最大値が[1900、2000]に配置することができると仮定すると、それは最小12、1911を必要とし、残りは1911まで追加することができません。

ターンでは、我々は最大数が1111を超えることはできませんがわかります。プログラムの結果によって、最大値は712です。

改善後は、テーブルをヒットしないACことができます。


# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]


# 输入一个数,计算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c


COUNT = [0] * 713
for i in range(0, 713):
    COUNT[i] = count(i)

result = 0

n = int(input())

for i in range(0, 712):
    for j in range(0, 712):
        if i + j > 712:
            continue
        if COUNT[i] + COUNT[j] + COUNT[i+j] == n - 4:
            result += 1

print(result)

おすすめ

転載: www.cnblogs.com/nxlhero/p/11691957.html