티스토리 뷰

[ BOJ ] 27496번 : 발머의 피크이론

문제 : https://www.acmicpc.net/problem/27496


[  문제  ]

발머의 피크 이론이란 혈중 알코올 농도 일때 초인적인 프로그래밍 능력을 가지게 된다는 이론이다. 기령이는 발머의 피크 이론 신봉자이기 때문에 지금부터 코딩테스트를 볼 때까지 혈중 알코올 농도를 최대한 지키려고 한다. 기령이는 매 시간마다 정해진 술을 섭취하며, 섭취한 알코올은 일정 시간이 지나면 분해된다. 기령이가 지금부터 코딩테스트를 볼 때까지 얼마나 혈중 알코올 농도를  사이로 지킬 수 있는지 알아내보자. 단, 혈중 알코올 농도 증가량은 술에 포함된 알코올의 양 로 계산하며 최초의 혈중 알코올 농도는 이다.

[  입력  ]

첫째 줄에 코딩테스트를 볼 때까지 남은 시간 , 섭취한 알코올의 지속시간 이 공백으로 구분되어 주어진다.

둘째 줄에 술에 포함된 알코올의 양 정수 가 공백으로 구분되어 주어진다.

[  출력  ]

혈중 알코올 농도 로 유지한 시간을 출력한다.


[  문제 접근 및 풀이  ]

알코올이 $L$시간이 지나면 없어지기에 

혈중 알코올 농도의 점화식을 쉽게 구할 수 있었다.

$C_n$ = $a_{n-L+1}$ + $a_{n-L+2}$ + $\cdots$ + $a_{n-1}$ + $a_{n}$

따라서 누적합을 구한 후에 $n-L+1$ 부터 $n$까지의 알코올 농도의 구간 합을 찾는 문제였다.

그 후 0.001을 곱하지 않고 양수로 처리한 후 0.129~0.138 대신

129~138을 유지한 시간에는 cnt를 증가 시켜주었다.

[  소스 코드  ]

#include<bits/stdc++.h>
using namespace std;
int N,L;
int al[1000001],cnt;
long long psum[1000001];
void Q_27496();
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	Q_27496();
}
void Q_27496(){
    cin >> N >> L;
    for(int i=1;i<=N;i++){
        cin >> al[i];
    }
    for(int i=1;i<=N;i++){
        psum[i]=al[i]+psum[i-1];
    }
    for(int i=1;i<=N;i++){
        long long C;
        if(i<=L) {
            C=psum[i];
        } else{
            C=psum[i]-psum[i-L];
        }
        if(C>=129 and C<=138) cnt++;
    }
    cout << cnt;
}

 


'BOJ' 카테고리의 다른 글

[ BOJ / C++ ] 16509번 : 장군  (0) 2025.03.09
[ BOJ / C++ ] 20291번 : 파일 정리  (4) 2025.03.09
[ BOJ / C++ ] 2606번 : 바이러스  (0) 2025.03.02
[ BOJ / C++ ] 14890번 : 경사로  (2) 2025.03.02
[ BOJ / C++ ] 14501번 : 퇴사  (0) 2025.03.02