JMK no matter what

GCJ 2010 Qualification Round

스몰은 무조건 쉽게 짜보고 하드는 다시 짜는 전략으로. 쉬운 문제 세개였다.

Snapper Chain

시뮬레이션 해보면 켜져있다 = 1, 꺼져있다 = 0 으로 두면 0 부터 2^n-1 까지를 순환한다는 것을 알 수 있다. 스몰은 그냥 시뮬레이션으로 내고 라지는 다시 짜서 냄. ㅋ

스몰

lang:py
import sys
rl = lambda: sys.stdin.readline().strip()

t = int(rl())
for cc in range(t):
    n, k = map(int, rl().split())
    is_on = [False] * n
    for i in range(k):
        j = 0
        while j < n and (j == 0 or is_on[j-1] == True):
            j += 1
        for k in range(j):
            is_on[k] = not is_on[k]
        print is_on
    print "Case #%d: %s" % (cc+1, "ON" if all(is_on) else "OFF")

라지

lang:py
import sys
rl = lambda: sys.stdin.readline().strip()

t = int(rl())
for cc in range(t):
    n, k = map(int, rl().split())
    print "Case #%d: %s" % (cc+1, "ON" if (k+1) % (2**n) == 0 else "OFF")

Fair Warning

a+x 와 b+x 의 최대 공배수가 y 라고 하자. 그러면 (b+x)-(a+x)=b-a 도 y 의 배수여야 한다. 따라서 답이 되는 T 는 숫자들 차이간의 gcd 임이 당연. 만약 x년이 지나서 a 가 T의 배수가 되었다면, T는 주어진 숫자간 차이들의 공약수이므로 모두 T의 배수가 된다.

fractions.gcd 있다는걸 깜박하고 직접 코딩함 ㅡ,.ㅡ

lang:py
import sys
rl = lambda: sys.stdin.readline().strip()

def gcd(a, b):
    if b == 0: return a
    return gcd(b, a % b)

cases = int(rl())
for cc in range(cases):
    t = map(int, rl().split())[1:]
    t.sort()

    deltas = [a-b for a, b in zip(t[1:], t)]
    z = reduce(gcd, deltas)
    sol = max(z - (v % z) if v % z > 0 else 0 for v in t)

    print "Case #%d: %d" % (cc+1, sol)

Theme Park

시뮬레이션

lang:py
import sys
rl = lambda: sys.stdin.readline().strip()

t = int(rl())
for cc in range(t):
    r, k, n = map(int, rl().split())
    g = map(int, rl().split())
    sol = 0
    for i in range(r):
        sum = 0
        ride = 0
        while ride < n and sum+g[ride] <= k:
            sum += g[ride]
            ride += 1
        sol += sum
        g = g[ride:] + g[:ride]
    print "Case #%d: %d" % (cc+1, sol)

사이클 디텍션

lang:py
import sys
rl = lambda: sys.stdin.readline().strip()

t = int(rl())
for cc in range(t):
    r, k, n = map(int, rl().split())
    g = map(int, rl().split())

    lastSeen = [-1] * n
    rodeSoFar = [-1] * n

    beginWith = 0
    rides = r
    moneyEarned = 0
    while rides > 0:
        if lastSeen[beginWith] != -1:
            cycleLength = lastSeen[beginWith] - rides
            if rides >= cycleLength:
                cycleSize = moneyEarned - rodeSoFar[beginWith]
                cycles = rides / cycleLength
                """
                print "Cycle found: beginwith %d seen before" % beginWith
                print "cycleLength %d rides, cycle size %d" % (cycleLength,
                                                               cycleSize)
                print "%d rides remaining => %d cycles" % (rides, cycles)
                """
                moneyEarned += cycleSize * cycles
                rides -= cycleLength * cycles
                continue
        else:
            lastSeen[beginWith] = rides
            rodeSoFar[beginWith] = moneyEarned
        rideThisTime = 0
        rideUpto = beginWith-1
        groups = 0
        while groups < n and rideThisTime + g[(rideUpto+1) % n] <= k:
            rideUpto = (rideUpto+1) % n
            rideThisTime += g[rideUpto]
            groups += 1
        moneyEarned += rideThisTime
        """
        print ("starting from %d, %d people ride, next begin %d"
               % (beginWith, rideThisTime, (rideUpto+1)%n))
               """
        beginWith = (rideUpto+1) % n
        rides -= 1

    print "Case #%d: %d" % (cc+1, moneyEarned)
2010-05-09 11:58:38 | JM | /logs/contests/ | 0 Comments

Leave a comment