USACO 2016 February (Bronze)
11 Mar 2020 | Python USACO PSUSACO 2016 February
1. Milk Pails
X,Y의 수가 1000이하로 작으므로 M에 들어갈수 있는 조합을 전부 탐색하면 된다.
with open("pails.in", "r") as f:
    x, y, m = map(int, f.readline().strip().split())
ans = 0
for i in range(m//x+1):
    for j in range(m//y+1):
        if x*i + y*j <= m:
            ans = max(ans, x*i + y*j)
with open("pails.out", "w") as f:
    f.write(str(ans)+"\n")
2. Circular Barn
입력이 크지 않아서 리스트를 회전시키면서 전부 탐색했다.
실제 리스트를 회전시키지 않고 a[j%n]의 형태로 인덱스만 탐색하는 방법도 있다.
a = []
with open("cbarn.in", "r") as f:
    n = int(f.readline().strip())
    for _ in range(n):
        a.append(int(f.readline().strip()))
ans = float("inf")
for i in range(n):
    cur = 0
    for j in range(1, n):
        cur += a[j]*j
    ans = min(ans, cur)
    l = a.pop()
    a.insert(0, l)
with open("cbarn.out", "w") as f:
    f.write(str(ans)+"\n")
3. Load Balancing
N의 값은 작으나 좌표의 값이 크므로 좌표를 일일히 스캔할수는 없다. 각각의 소의 위치를 기준으로 x, y를 가로지르는 펜스를 구성하고 사분면에 해당하는 소의 수를 세는 방식으로 구성하면 100*100개의 조합에 대해서만 각각의 소가 어떤 사분면에 해당하는지 세면 된다.
xpos = []
ypos = []
with open("balancing.in", "r") as f:
    n, b = map(int, f.readline().strip().split())
    for _ in range(n):
        x, y = map(int, f.readline().strip().split())
        xpos.append(x)
        ypos.append(y)
ans = n # 한점에 모든 소가 모여있는 경우가 최악의 경우
for x in xpos:
    for y in ypos:
        xdiv = x+1
        ydiv = y+1
        d1 = d2 = d3 = d4 = 0
        for i in range(n):
            if xpos[i] < xdiv and ypos[i] > ydiv:
                d1 += 1
            elif xpos[i] > xdiv and ypos[i] > ydiv:
                d2 += 1
            elif xpos[i] < xdiv and ypos[i] < ydiv:
                d3 += 1
            else:
                d4 += 1
        m = max(d1, d2, d3, d4)
        ans = min(m, ans)
with open("balancing.out", "w") as f:
    f.write(str(ans)+"\n")
            
Comments