본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 30677 반짝반짝 빛나는 별가루

by Alan_Kim 2024. 2. 19.
728x90
반응형

https://www.acmicpc.net/problem/30677

 

30677번: 반짝반짝 빛나는 별가루

첫째 줄에는 $N,K,C,R$ 이 공백을 사이에 두고 주어진다. $(1 \leq K \leq N \leq 100 \, 000;$ $1 \leq C \leq 100;$ $1 \leq R \leq 100)$ 둘째 줄에는 $base_1, \cdots , base_K$가 공백을 사이에 두고 주어진다. $(1 \leq base_i \le

www.acmicpc.net

 

 

문제해결

  • 쉬운 문제인줄 알았는데 계속 오류가나서 많이 해매었던 문제
  • 원인은 정밀도에 있었다고 한다.
  • $combo*C$나 $skill_{i} s_{i}$같은 경우 소수점 계산에서 오류가 날 수 있다고 한다.
  • 따라서 각각 100을 곱해준 다음 나중에 버림할 때 한번에 10000을 나눠서 몫을 계산하는게 좋다고한다.
  • 이를 유의해서 다음부터 히든테스크를 잘 피해나가야겠다.

 

 

CODE

import sys
input = sys.stdin.readline

def calculate(i):
    result = (base[i]*(100+combo*c)*(100+skill[i]*s[i]))//10000
    skill[i] += 1
    return result

if __name__=='__main__':
    n, k, c, r= map(int, input().split())
    base = [0] + list(map(int, input().split()))
    s = [0]+list(map(int, input().split()))
    p = [0]+ list(map(int, input().split()))
    answer = 0
    combo = 0 # 연속으로 사용한 마법 횟수
    skill = [0 for _ in range(k+1)]
    tired = 0 # 초기 피로도
    broke = False
    for _ in range(1,n+1):
        l = int(input())
        if l==0:
            tired = max(0, tired-r)
            combo = 0
        else:
            delta = calculate(l)
            combo += 1
            answer += delta
            tired += p[l]
            if tired>100:
                print(-1)
                exit()
    print(answer)
728x90
반응형

댓글