문제
복서 성우는 항상 공격과 회피를 연속적으로 한다.
슥~빡! 빡~슥!
즉, 피하고 때리거나, 때리고 피한다.
어느 날, 복서 성우는 숙명의 라이벌 성준이와 복싱 경기를 치르게 되었다.
이 경기에서 성우는 오직 번의 공격-회피 연속 동작을 통해 성준을 상대할 예정이다.
성우는 매 공격-회피 연속 동작 시의 체내 아드레날린 변화량을 정확히 알고 있다.
번째 공격-회피 연속 동작 상황에서,
- 공격 시에는 체내 아드레날린이 만큼 증가하고,
- 회피 시에는 체내 아드레날린이 만큼 감소한다.
또한 번째 공격-회피 연속 동작 상황에서,
- 공격을 먼저 한다면, 공격 시 체내 아드레날린 증가량이 에서A_i * K_i로 바뀌고,
- 회피를 먼저 한다면, 회피 시 체내 아드레날린 감소량이 에서B_i * K_i로 바뀐다.
성우는 경기 종료 시에 체내 아드레날린 양이 높을수록 만족스러운 경기를 치렀다고 생각한다.
성우의 경기 종료 시 최대 체내 아드레날린 양을 구해보자. 경기 시작 시 성우의 체내 아드레날린 양은 0이다.
입력
첫째 줄에 연속 동작의 횟수 이 주어진다. (1≤�≤100000 )
둘째 줄에 공격 시 체내 아드레날린 증가량을 나타내는 정수 �� 들이 공백으로 구분되어 주어진다. (10≤��≤1000 )
셋째 줄에 회피 시 체내 아드레날린 감소량을 나타내는 정수 �� 들이 공백으로 구분되어 주어진다. (10≤��≤1000 )
넷째 줄에 아드레날린 증가량과 감소량의 변화를 나타내는 실수인 �� 들이 공백으로 구분되어 소수점 아래 첫째 자리까지 주어진다. (0<��≤1000 )
출력
첫째 줄에 성우의 경기 종료 시 최대 체내 아드레날린 양을 출력한다.
예제 입력 1 복사
3
30 30 30
40 40 40
3.4 3.4 3.4
예제 출력 1 복사
186
예제 입력 2 복사
5
11 22 33 44 55
111 99 88 77 66
1.1 1.2 1.3 1.4 1.5
예제 출력 2 복사
-218
성우는 우주 최강 복서이기 때문에 경기 종료 시 체내 아드레날린이 음수일 수 있다.
풀이
k배열 값이 1보다 작으면 공격에 곱하면 무조건 아드레날린을 손해보기에
1보다 작을때는 회피에 곱하고 크면 공격에 곱해줬다
k는 소수점 아래 한 자리까지 들어오기에 * 10으로 받아서 연산할때 / 10 해주는 식으로 소수점 아래 계산이 안되는 경우를
막으니 문제가 풀렸다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
long res = 0;
int[] attack = new int[n];
int[] dodge = new int[n];
int[] ap = new int[n];
for (int i = 0; i < n; i++){
attack[i] = in.nextInt();
}
for (int i = 0; i < n; i++){
dodge[i] = in.nextInt();
}
for (int i = 0; i < n; i++){
float a = in.nextFloat() * 10;
ap[i] = (int)a;
}
for (int i = 0; i < n;i++){
if (ap[i] >= 10) res += (attack[i] * ap[i]) / 10 - dodge[i];
else res += attack[i] - (dodge[i] * ap[i]) / 10;
}
System.out.println(res);
}
}
'자바 알고리즘 > 백준' 카테고리의 다른 글
백준 2805 나무자르기 (매개변수 탐색) (0) | 2024.03.27 |
---|---|
백준 2417 정수 제곱급 (0) | 2024.03.27 |
백준 10816 (map) (1) | 2024.03.24 |
백준 2467(이분탐색) (0) | 2024.03.22 |
2295 세수의 합(set, 누적합) (0) | 2024.03.21 |