[BaekJoon]13458:監査


🔒 質問する


全部でN個の試験場があり、試験場ごとに受験者がいる.i番試験場の受験者はAi名です.
監督員には総監と副監督の2種類がある.監督試験者が1つの試験場で監視できる受験者はB名、副監督者が1つの試験場で監視できる受験者はC名である.
各試験場には監督が1人しかいないので、いくつかの副監督試験があります.
試験場ごとに受験生を監視しなければならない.この場合、必要な監督人数の最大値を求めるプログラムを作成してください.

🛫 入力


1行目は試験場の個数N(1≦N≦1000000)を与える.
2行目は各試験場の受験者数Ai(1≦Ai≦1000000)を与える.
3行目はBとCです.(1 ≤ B, C ≤ 1,000,000)

🛬 しゅつりょく


試験場ごとに受験生を監督するために必要な最小限の監督人数が出力されます.

🔑 に答える


表タイムアウトコード
n = int(input()) # 시험장 수
a = list(map(int, input().split())) # 각 시험장 응시자 수
b, c = map(int, input().split())
result=0

for i in range(len(a)) :
    a[i] -= b
    result += 1
    while (a[i] > 0) :
        a[i] -= c
        result += 1
print(result)
念のためpypy 3で回したらタイムアウト
二重複文が時間の複雑さを増したからだ.
🍀 正解!
n = int(input()) # 시험장 수
a = list(map(int, input().split())) # 각 시험장 응시자 수
b, c = map(int, input().split())
result=0

for i in range(len(a)) :
    a[i] -= b
    result += 1
    if (a[i] > 0) : 
        d = a[i]//c
        result+= d
        if (a[i] % c > 0) :
            result += 1

print(result)
🏅 Refactoring
考えてみれば、総監督の人数は結局n人で、別に数えなくてもいい.
出力値はnの値に加算してもよく、変数として別途設定する必要はありません.
n = int(input()) # 시험장 수
l = list(map(int, input().split())) # 각 시험장 응시자 수
b, c = map(int, input().split())

for i in range(len(l)) :
    a[i] -= b
    if (a[i] > 0) : 
        d = a[i]//c
        n += d
        if (a[i] % c > 0) :
            n += 1

print(result)
このようにすれば、副監督官の数だけ数えることができ、for文の二重for文の式は、入力エラーで整数を返す関数ceil(mathモジュールimportが必要)と、範囲内の最大値データ型を返すmax関数とで実現できる.
import math

n = int(input()) # 시험장 수
l = list(map(int, input().split())) # 각 시험장 응시자 수
b, c = map(int, input().split())

for i in l :
    n += math.ceil(max(0,(i-b)/c))

print(n)

📌 Pinned


n個の入力をlistに変換する方法


a = list(map(int, input("Enter a multiple value: ") .split() ))

Pythonのリストの要素を順番に参照する場合:for i in listname

...
l=list(map(int,input().split()))
...
for i in l:
    n+=math.ceil(max(0,(i-a))/b)