본문 바로가기

PS - 알고리즘

14679 - 영우와 ‘갓4’

step 1

더보기

전투를 1000번만 치루면 모든 스탯이 몬스터보다 높고 공격도 먼저 합니다. 즉, 이 이후로는 항상 이긴다고 생각할 수 있습니다.

step 2

더보기

현재 몬스터의 스탯을 알고 있을 때 다음 몬스터의 스탯은 $\log n$(https://codestudycafe.tistory.com/2)에 알 수 있습니다.

step 3

더보기

몬스터는 50,000,000마리가 있고 모든 몬스터의 상태를 계산해 주긴 해야합니다. dp를 만들어서 해결할 수 있습니다.

 

dp[i][j][k]: 현재 몬스터의 공격력이 i, 방어력이 j, 체력이 k일 때 다음 몬스터의 공격력, 방어력, 체력

 

이 dp를 만들면 시간을 줄일 수 있습니다.

코드

더보기
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
pair<pair<long long int,long long int>,long long int> mapp[110][10][1100];
long long int ch[110][10][1100];
long long int win(long long int x, long long int y, long long int z, long long int xx, long long int yy, long long int zz) {
    long long int at = max((x - yy), 1ll);
    long long int at2 = max((xx - y), 1ll);
    long long int c1 = (zz % at == 0 ? zz / at : zz / at + 1);
    long long int c2 = (z % at2 == 0 ? z / at2 : z / at2 + 1);
    if (c1 <= c2) return 1; else return 0;
}
long long int poww(long long int x, long long int y, long long int z) {
    if (y == 1) return x;
    long long int v = poww(x, y / 2, z);
    v = v * v % z;
    if (y % 2 == 0) return v;
    return v * x % z;
}
int main() {
    long long int n, i, x, y, z, ex, ey, ez, sx1, sy1, sz1, sx2, sy2, sz2;
    scanf("%lld", &n);
    scanf("%lld%lld%lld", &x, &y, &z);
    scanf("%lld%lld%lld", &ex, &ey, &ez);
    scanf("%lld%lld%lld%lld%lld%lld", &sx1, &sx2, &sy1, &sy2, &sz1, &sz2);
    for (i = 1;i <= n;i++) {
        if (i<=2000 && !win(x, y, z, ex, ey, ez)) {
            printf("-1"); return 0;
        }
        x += ex; y += ey; z += ez;
        x %= 1000000007;
        y %= 1000000007;
        z %= 1000000007;
        if (ch[ex][ey][ez] !=0) {
            auto tmp = mapp[ex][ey][ez];
            ex = tmp.first.first;
            ey = tmp.first.second;
            ez = tmp.second;
            continue;
        }
        long long int tx = ex, ty = ey, tz = ez;
        ex = (poww(ex, sx1, 100) + sx2) % 100 + 1;
        ey = (poww(ey, sy1, 3) + sy2) % 3 + 1;
        ez = (poww(ez, sz1, 1000) + sz2) % 1000 + 1;
        ch[tx][ty][tz] = 1;
        mapp[tx][ty][tz] = { {ex,ey},ez };
    }
    printf("%lld %lld %lld", x, y, z);
    return 0;
}

'PS - 알고리즘' 카테고리의 다른 글

1090 - 체커  (0) 2024.07.11
30294 - Flea  (1) 2024.07.05
11401 - 이항 계수 3  (0) 2024.07.05
6612 - 개미의 이동  (0) 2024.06.27
11868 - 님 게임 2  (0) 2024.06.26