본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 16648 : Accumulator Battery

반응형

https://www.acmicpc.net/problem/16648

 

16648번: Accumulator Battery

The only line of the input contains two integers t and p — time Anna needs to get from her home to the meeting place, in minutes, and the battery level of her phone at the moment of meeting, in percent (1 ≤ t ≤ 360; 1 ≤ p ≤ 99).

www.acmicpc.net

방정식을 세우고 공식을 도출해 답을 출력하는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

 미팅 장소에 도착까지 걸리는 t분, t분 지나 도착하니 100%에서 p%가 된 상황입니다. t, p, 답을 저장할 변수 ans를 선언하고 입력받습니다.

📔 풀이과정

 두 경우로 나뉩니다.

 

 1. p > 20 인 경우

  (100 - p)%의 배터리를 t분동안 소모했습니다. p - 20분 동안에는 소모율이 분당 (100 - p) / t입니다. (p - 20) / 해당 소모율만큼 Anna는 행복할 수 있습니다. 이 후 배터리가 20% 되는 시점에서는 구한 소모율에서 / 2 만큼의 소모율을 가지므로 이를 echo mode 소모율이라고 한다면 답은 (p - 20) / 그냥 소모율 + (p - (p - 20)) / echo mode소모율 입니다. 이를 ans변수에 저장합니다.

 

 2. else

 (100 - p)%의 배터리를 t분동안 소모했습니다. 80%의 배터리를 x분동안 소모했으며 (20 - p)만큼의 배터리를 (t - x)분 동안 소모했다고 생각하면 80 / x가 그냥 소모율, (20 - p) / (t - x)가 echo mode 소모율이 됩니다. echo mode 소모율 * 2 = 그냥 소모율이므로 (80 / x) = (20 - p) / (t - x) * 2 라는 방정식을 세워 x분을 구할 수 있습니다. 해당 식을 풀어 x에 대해 다시 공식을 세우면 x = (40 - t) / (60 - p)가 됩니다. 구하고 싶은 것은 echo mode의 소모율이므로 80 / x / 2가 됩니다. 남은 시간 p / echo mode 소모율이 답이 됩니다. 이를 ans변수에 저장합니다.

📔 정답출력

 ans를 소수 6번째자리까지 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
double t, p, consumptionRate, ans;
int main(){
    cin >> t >> p;
    if(p > 20) {
        consumptionRate = (100.0 - p) / t;
        ans += (p - 20.0) / consumptionRate;
        p -= (p - 20.0);
        ans += p / (consumptionRate / 2.0);
    }
    else {
        double x = (40.0 * t) / (60.0 - p); //80%를 x분 동안 소모
        consumptionRate = 80.0 / x / 2;
        ans = p / consumptionRate;
    }
    printf("%.6f", ans);
}