[python]BOJ 10800カラーボール
問題の説明
プレイヤーはそれぞれ特定の色と大きさのボールを操作してゲームに参加し、別のボールを捕まえても自分のボールの色と大きさは変わりません.プレイヤーが持っているボールよりも小さく、色の異なるボールだけが捕まえられる.問題の目標は、各プレイヤーが所定のボールで捉えることができるすべてのボールの大きさの和を出力することである.解法をざっと見て、以下のようになります.
コードの説明
import sys
n = int(input())
INF = 200000
balls = []
for i in range(n):
color, size = map(int, sys.stdin.readline().split())
balls.append((size, color, i))
#공의 size, color, input 순서(player)에 대한 정보를 넣는다
balls.sort()
color_count = [0] * (INF + 1)
total = 0
j = 0
ans = [0] * (n + 1)
for i in range(n):
while balls[j][0] < balls[i][0]: # 문제의 제한조건에서 player가 잡을 수 있는 전제 조건 중 하나인
# 나의 공보다 사이즈가 작아야 잡을 수 있다의 조건을 충족시켜주기 위한 부분
color_count[balls[j][1]] += balls[j][0]
total += balls[j][0]
j += 1
ans[balls[i][2]] = total - color_count[balls[i][1]] # 누적합 계산
# 나의 공보다 작은 공들의 크기 총합에서 나와 색깔이 같은
# 공들의 합을 빼준다
# 문제의 제한 조건 중 하나인 색깔이 다른 공만 잡을 수 있다
# 여기까지 완료해 주면 문제의 두가지 제한조건이 완성
for i in range(n):
print(ans[i])
注意事項
「同じ色ではつかめないか、小さくしかつかめない」と言い換えると、問題の難易度が垂直に下がります.これは2つの条件を同時に満たす必要がある問題で、簡単な加算減算のように見えますが、条件を与えて、重ならずに欲しい値を抽出させることが重要です.また、問題で発生する可能性のある球数の範囲(1≦N≦200000)は非常に大きいので、この部分を減らす方法を考えなければならない.
問題に答える
https://www.acmicpc.net/problem/10800
Reference
この問題について([python]BOJ 10800カラーボール), 我々は、より多くの情報をここで見つけました https://velog.io/@jinlee/python-BOJ-10800-컬러볼テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol