※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts