AtCoder ABC 227 B – KEYENCE building Python解説

KEYENCE building

1 から N の番号がついた N 人の人がいます。
人 i はキーエンス本社ビルの建築面積を Si平方メートルであると予想しました。
キーエンス本社ビルは下図のような形をしています。ただし、a,b はある 正の整数 です。
つまり、キーエンス本社ビルの建築面積は 4ab+3a+3b 平方メートルと表されます。
N 人のうち、この情報のみによって、予想した面積が確実に誤りであるとわかる人数を求めてください。

AtCoder Beginner Contest「KEYENCE building」

建築面積の計算方法4ab + 3a + 3bが取り得る面積を調べていきます。a, bは整数、面積Sの上限は1000なので、この範囲の建築面積を配列に加えていきます。最後に予想された面積が配列に存在するかどうかを見ていきましょう。

n = int(input())
s = list(map(int, input().split()))

result = []

for a in range(1, 1001):
    for b in range(1, 1001):
        if (4 * a * b) + (3 * a) + (3 * b) <= 1000:
            result.append((4 * a * b) + (3 * a) + (3 * b))
        else:
            break

cnt = 0

# (*1)
for i in s:
    if i not in result:
        cnt += 1
        
print(cnt)

(*1)ここで予想された面積が配列の中にあるかを見ています。if i not in resultの部分で配列に存在しなければcntを+1しています。

n = int(input())
s = list(map(int, input().split()))

cnt = 0

for i in s:
    flag = False
    for a in range(1, 1001):
        for b in range(1, 1001):
            if (4 * a * b) + (3 * a) + (3 * b) == i:
                flag = True
                break
            elif (4 * a * b) + (3 * a) + (3 * b) > i:
                break
    if not flag:
        cnt += 1
        
print(cnt)

こちらのコードだと、配列を使わず、予想された面積になるかどうかa, bをひとつずつ調べていきます。予想された面積になるa, bがなければcntを+1します。