문제(출처: https://www.acmicpc.net/problem/4679)
< The Snail >
문제 풀이
U만큼 오르고, D만큼 내려간다. 하루가 지날수록 첫날 오를 수 있는 U x (F/100) 만큼씩 깎인다. while문을 사용하여 이 과정을 반복해 H보다 높이 오를 수 있는지, 오를 수 없는지 구한다.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.OutputStreamWriter;
public class _4679_ { // The Snail
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int H, D, F;
Double U;
st = new StringTokenizer(bf.readLine());
while ((H = Integer.parseInt(st.nextToken())) != 0) {
U = Double.parseDouble(st.nextToken());
D = Integer.parseInt(st.nextToken());
F = Integer.parseInt(st.nextToken());
double p = 0;
int d = 0;
double l = U * (double) F / 100;
boolean flag = false;
while (true) {
d += 1;
p += U;
if (p > H) {
break;
}
p -= D;
if (p < 0) {
flag = true;
break;
}
U -= l;
if (U < 0) {
U = 0.0;
}
}
if (flag) {
bw.write("failure on day " + d + "\n");
} else {
bw.write("success on day " + d + "\n");
}
st = new StringTokenizer(bf.readLine());
}
bw.flush();
}
}
변수)
H, U, D, F : 우물의 높이, 낮 동안 올라갈 수 있는 거리, 밤에 미끄러져 내려가는 거리, 피로 계수
p : 현재 위치
d : 성공한 날
l : 피로도에 인해 손실된 거리
flag : 성공 여부
H값이 0이 아닐 때까지 H, U, D, F 값을 입력받는다. 피로도에 인해 손실된 거리를 구해두고 다음 과정을 반복한다.
1) d+1
2) U만큼 오르기
3) 오른 후에 H보다 커 우물에서 나왔다면 종료
4) D만큼 미끄러짐
5) 미끄러진 후에 0보다 작다면 실패한 것이므로 flag를 true로 저장 후 종료
6) 피로도에 의해 낮 동안 올라갈 수 있는 거리 감소
7) 낮 동안 올라갈 수 있는 거리가 0보다 작다면 올라가지 않으므로 0으로 저장
최종 실패, 성공에 따라 출력한다.
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 26876_New Time (1) | 2025.05.26 |
---|---|
[Baekjoon] 10689_Hamza (1) | 2025.05.23 |
[Baekjoon] 16756_Pismo (2) | 2025.05.21 |
[Baekjoon] 6325_Definite Values (1) | 2025.05.19 |
[Baekjoon] 21030_Frequent Alphabet (2) | 2025.05.16 |