※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25171번 문제인 긴장한 아리와 쿠기의 카드게임이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25171
25171번: 긴장한 아리와 쿠기의 카드게임
아리와 쿠기는 같이 카드게임을 하고 있다. 이 게임은 둘이 협동하여 소환수를 소환해, 몬스터를 잡는 협동 게임이다. 이 게임에 쓰이는 카드에는 수가 적혀 있다. 아리와 쿠기가 뽑는 카드에 따
www.acmicpc.net
먼저 아리가 카드를 한 구간 뽑은 상황을 생각해보자. 그렇다면 소환수의 공격력은 해당 구간의 카드에 적힌 숫자의 합으로 정해진다.
소환수의 공격력이 정해진다면 소환수의 공격력과 몬스터의 체력을 종합해 몬스터가 죽으려면 몇 턴이 걸리는지 알 수 있고, 이를 이용하면 소환수의 체력이 얼마 이상이어야 몬스터가 쓰러질 때까지 버틸 수 있는지를 계산해낼 수 있다.
남은 카드들을 조합해 위에서 구한 HP보다 많은 체력을 갖게 구간을 선택하는 경우의 수는 투포인터를 이용해 쉽게 계산해낼 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
ll N, X, Y;
int arr[501];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll ans = 0;
cin >> N >> X >> Y;
for (int n = 1; n <= N; n++) cin >> arr[n];
for (int atkL = 1; atkL <= N; atkL++) {
ll atk = 0;
for (int atkR = atkL; atkR <= N; atkR++) {
atk += arr[atkR];
ll minHP = X * ((Y - 1) / atk + 1);
int HPL;
if (atkL == 1) HPL = atkR + 1;
else HPL = 1;
ll hp = 0;
for (int HPR = HPL; HPR <= N; HPR++) {
if (HPR == atkL) {
HPR = atkR;
continue;
}
hp += arr[HPR];
while (hp > minHP) {
if (atkR < HPR) ans += N - HPR + 1;
else ans += N - HPR - (atkR - atkL);
hp -= arr[HPL];
HPL++;
if (HPL == atkL) HPL = atkR + 1;
}
}
}
}
if (ans) cout << ans;
else cout << "IMPOSSIBLE";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3055 // C++] 탈출 (0) | 2022.08.22 |
---|---|
[BOJ 25172 // C++] 꼼꼼한 쿠기의 졸업여행 (0) | 2022.08.21 |
[BOJ 25170 // C++] 명랑한 아리의 외출 (0) | 2022.08.21 |
[BOJ 25165 // C++] 영리한 아리의 포탈 타기 (0) | 2022.08.21 |
[BOJ 25190 // C++] 피앳산 청정수 (0) | 2022.08.21 |