제1회 임스의 메이플컵 (The 1st lms0806's Maple Cup) · Arena #6
www.acmicpc.net
- 알고리즘 대회 카테고리에서는 참가했던 알고리즘 대회마다 풀이할 수 있는 한에서 문제 풀이를 진행해보고자 합니다. :0
- 이번 글에서는 가장 먼저 참가했었던 "제1회 임스의 메이플컵 (The 1st lms0806's Maple Cup) · Arena #6" 대회에 대한 문제를 다뤄보겠습니다.
A번 : 임스의 메이플컵
29790번: 임스의 메이플컵
첫 번째 줄에 메이플컵에 지원한 지원자의 문제 해결 개수 $N$과 유니온 레벨 $U$, 최고 레벨 $L$이 공백을 사이에 두고 주어진다. $(1 \le N \le 130\,000;$ $1 \le U \le 12\,500;$ $1 \le L \le 300)$ 입력은 모두 정
www.acmicpc.net
- 조건에 따라 간단히 출력만 다르게 하면 되는 문제입니다.
# 구현
N, U, L = map(int, input().split())
if N >= 1000 and (U >= 8000 or L >= 260):
print('Very Good')
elif N >= 1000:
print('Good')
else:
print('Bad')
B번 : 에르다 노바와 오리진 스킬
29791번: 에르다 노바와 오리진 스킬
첫 번째 줄에는 임스의 에르다 노바 사용 횟수를 나타내는 정수 $N$와 오리진 스킬 사용 횟수를 나타내는 정수 $M$이 공백으로 구분되어 주어진다. $(1 \le N \le 1\,000\,000;$ $1 \le M \le 1\,000\,000)$ 두 번
www.acmicpc.net
- 각기 다른 두 스킬의 재사용 대기 시간을 고려하여 단축키를 눌렀을 때의 시간을 정렬하고, 그 사이 시간 차이를 확인하면 되는 문제입니다.
# 구현, 정렬
def count_selected_numbers(numbers, threshold):
count, last_selected = 0, 0
for number in numbers:
if last_selected == 0 or number - last_selected >= threshold:
count += 1
last_selected = number
return count
n, m = map(int, input().split())
A = sorted(map(int, input().split()))
B = sorted(map(int, input().split()))
a = count_selected_numbers(A, 100)
b = count_selected_numbers(B, 360)
print(a, b)
C번 : 규칙적인 보스돌이
29792번: 규칙적인 보스돌이
보스의 체력 $P$의 제한 $2.66 \times 10^{11}$와 드랍하는 메소 $Q$의 제한 $1\,596\,506$은 2023년 8월 10일 업데이트 이전의 가장 많은 체력(카오스 혼테일)과 결정의 가격(노멀 파풀라투스)을 가진 일간 보
www.acmicpc.net
- 캐릭터와 보스 데이터 입력: 각 캐릭터의 Damage와 각 보스의 체력 및 메소를 입력받습니다.
- 각 캐릭터별 최대 보상 계산: 모든 캐릭터에 대해, 모든 가능한 보스 조합을 고려하여 가장 높은 메소를 얻을 수 있는 조합을 찾습니다.
- 시간 제한 확인: 각 조합에 대해 캐릭터가 900초 이내에 보스를 모두 이길 수 있는지 확인합니다.
- 보상 계산 및 정렬: 각 캐릭터의 최대 메소를 계산하고, 이를 내림차순으로 정렬합니다.
- 최종 결과 계산: 상위 M개의 캐릭터의 메소를 합산하여 최종 결과를 출력합니다.
# 비트 마스킹, 그리디, 브루트포스, 정렬
def calculate_time_to_defeat(boss_hp, character_dps):
time_taken = boss_hp // character_dps
if boss_hp % character_dps != 0:
time_taken += 1
return time_taken
n, m, k = map(int, input().split())
damages = [int(input()) for _ in range(n)]
boss_info = [tuple(map(int, input().split())) for _ in range(k)]
reward = [0] * n
bit_end = 1 << k
for character_idx in range(n):
for boss_combination in range(bit_end):
total_time_taken = 0
total_reward = 0
for boss_idx in range(k):
if not (boss_combination & (1 << boss_idx)):
continue
boss_hp, boss_reward = boss_info[boss_idx]
time_taken = calculate_time_to_defeat(boss_hp, damages[character_idx])
total_time_taken += time_taken
total_reward += boss_reward
if total_time_taken <= 900:
reward[character_idx] = max(reward[character_idx], total_reward)
reward.sort(reverse=True)
result = sum(reward[:m])
print(result)
D번 : 라라와 용맥 변환
29793번: 라라와 용맥 변환
첫 번째 줄에는 맵에 있는 용맥의 수와 몬스터의 체력을 나타내는 두 정수 $N$, $H$가 공백으로 구분되어 주어진다. $(1 \le N, H \le 1\,000\,000)$ 두 번째 줄에는 맵에 있는 용맥의 종류를 순서대로 나타
www.acmicpc.net
- D번을 포함해서 나머지 문제들은 추후에 풀게 되면 풀이를 추가하도록 하겠습니다!
'알고리즘 대회 > 백준' 카테고리의 다른 글
제1회 유틸컵 - Chapter 2 (0) | 2023.11.17 |
---|