혹시 제출한 코드 수정 가능한가요?

  • riceluxs1t
    riceluxs1t

    사실 algospot을 풀면서 정답을 제출 한 뒤에 저보다 더 낳은 코드를 작성하신 분들의 것들을 보면서 많이 배우고 있는 1인 입니다.

    그럴 때 느끼던 생각이..
    '아 이런 엘레강스한 코드에 주석이 조금만 잇엇어도.. 이해하기 쉬울텐데' 하는 생각때문에 나도 항상 주석을 달하야지 하지만서도..

    디버깅을 하다가 불쑥 정답을 받아버리면 그 후 주석을 단 코드는 길이가 더 길기 때문에..통계란에 보여지는 코드를 수정 할 수 없음이 안타까웠습니다.

    그래서 궁금하네요ㅜㅜ 제출한 코드 수정 기능은 운영진은 가능한가요?

    그렇다면..magicpower 문제.. 풀어보고 뿌듯해서 주석단걸로 업데이트 부탁드립니다.

    # returns an arithmetic sequence sum 
    # a + (a-1) + (a-2) ... +    a total of 'm' terms.
    def seq(a, m):
        s = 0
        b = a
        while m > 0:
            s += b
            b -= 1
            m -= 1
        return s    
    
    
    """
    Given a sequence of equal/biggest numbers 'array[i... j]' (i,j inclusive)
    Use them 'subtractMe' times in a greedy fashion.
    In order to keep 'array' in order, use the rightmost item first.
    
    """
    def subtract(array, i, j, subtractMe):
    
    
        sum = 0
    
        #Use a multiple of (j - i + 1) times equally.
        m = subtractMe / (j - i + 1)
        for itr in range(i, j + 1):
            #use a sequence sum.
            sum += seq(array[itr], m)
            array[itr] -= m
    
        #Use the rest with the rightmost item first.
        #The rest <= (j - i + 2)
        rem = subtractMe % (j - i + 1)
        for itr in range(j, j - rem, -1):
            sum += array[itr]
            array[itr] -= 1
        #return i, j, sum where j is adjusted to cover the new range of eqal/biggest numbers.
        return i, j - rem, sum
    
    def solve(array, m):
        #sort the array in a DESCENDING order
        array.sort(reverse = True)
    
        n = len(array)
        #assume array[0] is the single biggest element.
        i = 0
        j = 0
    
    
        #find initial 'j' where array[i..j] = biggest/equal.
        while j < n - 1:
            if array[i] != array[j+1]: break
            j += 1
    
    
    
        #If the entire array is one of a single element, 
        if j == n - 1:
            #calculate the ans.
            amount = min(m, (j - i + 1)*(array[j]))
            return subtract(array, i, j, amount)[2]
    
        #'k' points to the second biggest element.
        k = j + 1
    
        #initial sum.
        s = 0
    
        #Until we end up using all 'm' times.
        while m > 0:
    
            #At each turn, we can use a minimum of 'm' times or
            #the upper area of array[i..j] that's above the second biggest element, times.
            amount = min(m, (j - i + 1)*(array[j] - array[k]))
    
            #decrease 'm'
            m -= amount
    
    
            res = subtract(array, i, j, amount)
            #update 'j'
            j = res[1]
    
    
            #we need to extend our array[i..j].
            if array[j] == array[k]:
                j = k
                k = j + 1
    
            #we need to decrease our array[i..j]
            else:
                j, k = res[1], res[1] + 1
    
            #update 'sum'
            s += res[2]
    
            #if we reached the 'end' of our array. i.e. 
            #all items are 'level'. = same height
            #look no further.
            if j == n - 1:
                amount = min(m, (j - i + 1)*(array[j]))
    
                return s + subtract(array, i, j, amount)[2]
    
        return s
    
    
    for _ in range(input()):
        l = raw_input().split()
        m = int(l[1])
        l = map(int, raw_input().split())
        print solve(l, m)
    


    9년 전
1개의 댓글이 있습니다.
  • JongMan
    JongMan

    연결해드렸습니다. 이런 요구 사항은 생각 못했네요.. ㅎㅎ


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.