본문 바로가기

코드포스

[코드포스 Practice20] C. Gabriel and Caterpillar

https://burningjeong.tistory.com/37

 

2869 달팽이는 올라가고 싶다

애증의 달팽이 문제.. 저렇게 했는데 틀려서 다시 알고리즘 짜봤다 근데 또 똑같은 알고리즘이 나왔다. 알고보니 (a-b)만큼 n일을 올라가고 마지막 낮에 a만큼 올라가므로 1을 더해줘야 한다. 해결

burningjeong.tistory.com

 

헉ㅋㅋㅋ 보자마자 너무 반가웠다

이거 전에 푼 달팽이 문제 아녀!!

 

빨리 푼다고 풀었는데 그래도 시간 좀 걸렸네;

 

You can consider that Gabriel noticed the caterpillar just after the classes at 2 pm.

 

이 문장에서 좀 헷갈렸다.

가브리엘이 (가브리살 먹고싶다) 2시에 하교할 때만 확인하는지 아니면 2시 이후에도 계속 확인하는지 애매,,

학교 가는 시간이라도 알려줬으면 아 애가 2시부터 아침 8시까지 벌레만 봤구나 생각이라도 할텐데.

 

아래의 힌트를 보니 저녁 6시에 벌레가 사과 먹었다고 하는 것 보니 딱 2시 정각에만 확인하는 건 아니구나 싶었다. 

그리고 저녁에는 벌레가 다시 내려가기 시작하니깐 사과에 도착할 리 없다. 그래서 2시 - 10시까지만 확인하기로 했음.

 

이 문장도 헷갈렸다.

벌레가 땅 밑으로 가면 사과로 올려보내 준다고?? 

내 생각엔 밤 돼서 땅 밑으로 내려가는 경우 고려하지 말라는 것 같음,, 

 

로직은 이렇게 짰다.

 

처음에 a <= b인지 확인하려 했는데

 

이런 경우는 가능해서 첫 날에 도착하는지 먼저 확인했다.

 

다음으로 도착할 수 없는 경우 예외처리 해주고 날짜 계산했다.

 

계산식은 달팽이 문제 참고해서 풀었다. 

 

하루에 올라갈 수 있는 거리 : 12(a - b)n

 

낮에 올라가는 거리 : 8a

 

낮은 12시간이지만 가브리엘이 확인하는 시간이 8시간이라 이 때를 낮으로 봤다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
 
int main() {
    int h1, h2, a, b;
    scanf("%d %d %d %d", &h1, &h2, &a, &b);
    
    // cout << h1 << h2 << a << b;
    
    int h = h2 - h1;
    if (a*8 >= h)
    {
        printf("0");
        return 0;
    }
    
    if (a <= b)
    {
        printf("-1");
        return 0;
    }
    
    cout << (h - 8*a + 12*(a-b) -1) / (12 * (a-b));
    
    return 0;
}

 

코드는 이렇게 짰음