PS

BOJ 5485 : 평균값 수열

lickelon 2024. 6. 19. 21:39
  • 문제 링크 : boj.kr/5485
  • 난이도 : G2
  • 태그 : 애드 혹

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<int> arr(n);
    for(auto &u : arr) cin >> u;

    int m, M;
    M = arr[0];
    m = arr[0] - (arr[1]-arr[0]);
    for(int i = 0; i < n-1; i++) {
        int a = arr[i];
        int b = arr[i+1];
        b = min(b, a + (a-m));
        m = max(a, a + (a-M));
        M = b;
    }
    cout << max(0, M-m+1);
    return 0;
}

풀이

i번째 원소의 값을 i-1번째 원소의 범위, i번째 평균값, i+1번째 평균값을 통해 범위를 구한다.

i번째 원소의 범위와 i-1번째 원소의 범위는 i번째 평균값을 기준으로 대칭적이게 된다.

단, 수열이 비감소 수열이기 때문에 i번째 원소의 범위는 i+1번째 평균값을 넘을 수 없다.

한 원소가 정해지고 나면 나머지 원소들이 정해지므로, 최종적인 범위에 들어가는 수의 개수가 답이 된다.

'PS' 카테고리의 다른 글

BOJ 27447 : 주문은 토기입니까?  (0) 2024.06.21
BOJ 25391 : 특별상  (0) 2024.06.20
BOJ 17205 : 진우의 비밀번호  (0) 2024.06.18
BOJ 1593 : 문자 해독  (0) 2024.06.17
BOJ 2138 : 전구와 스위치  (0) 2024.06.16