[02869]カタツムリが行きたがっている


[02869]我去了卡塔茨姆里


質問する


地面にカタツムリがいます.このカタツムリはVメートルの棒に登る.
カタツムリは昼にAメートルも上がる.でも、夜寝るとBメートル滑る.また、山頂に登ると滑ることはありません.
カタツムリはすべての棒に登るので、何日かプログラムを作ってください.

入力


1行目には3つの整数A,B,Vがあり、スペースで区切られています.(1 ≤ B < A ≤ V ≤ 1,000,000,000)

しゅつりょく


最初の行の出力カタツムリは木の棒を登って何日かかりますか.

コード#コード#

#include <iostream>

using namespace std;

int main() {
    int A, B, V, day;

    scanf("%d %d %d", &A, &B, &V);

    /*** 시간 초과 풀이 (식으로 풀지 않고 loop를 사용해 풀이)  ***
    
    // 첫 날 올라감
    day = 1;
    height = A;

    // 마지막 밤에 미끄러지 않는 것을 고려해 밤부터 count 시작
    while(height < V) {
        height += (A - B); // 밤 ~ 다음날 낮 올라간 높이 더함
        day++;
    }
    **********************************************************/

   /* 문제 풀이 */
   // 마지막 날엔 A만큼 올라가면 떨어지지 않으므로,
   // 매일 (A - B)만큼 (V - A) 이상 오면 됨
   // --> (V - A) / (A - B)
   // 단, 이 때 딱 떨어지지 않는 경우
   // 즉, (V - A) % (A - B)에 나머지가 발생하는 경우 하루를 더해줌
   // --> ((V - A) % (A - B) == 0)? 0 : 1
   // 마지막 날 A만큼 올라가는 하루 더해줌
   // --> day += 1
   day = (V - A) / (A - B) + (((V - A) % (A - B) == 0)? 0 : 1) + 1;

    printf("%d\n", day);
}

追加の説明


前述の解答は簡単な式を確立するのではなく,O(N)に必要なloopを用いて解き,問題の時間は0.15秒に制限し,loopを用いる場合,数字が大きい場合はタイムアウトに設定した.
そこでloopの過程をまとめ,一つの方法で表現した.
ソース:https://www.acmicpc.net/problem/2869