일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 구현
- 그리디
- 플로이드와샬
- lis
- 투포인터
- 크루스칼
- 삼분탐색
- DisjointSet
- DP
- 에라토스테네스의 체
- 정렬
- boj
- LazyPropagation
- 브루트포스
- dfs
- 펜윅트리
- 세그먼트트리
- 수학
- 이분매칭
- MST
- 좌표압축
- BFS
- 다익스트라
- 이진탐색
- 이분탐색
- 백준
- 위상정렬
- 비트마스크
- 누적합
- lca
Archives
- Today
- Total
lastknight00
[백준]평균값 수열(5485) 본문
문제 링크 : [백준]평균값 수열(5485)
문제 설명
A1, A2, A3...의 수열이 주어집니다.
이 수열은 차례로 (X1 + X2) / 2, (X2 + X3) / 2, (X3 + X4) /2 를 의미하는 수입니다.
X1, X2...가 순서대로 비내림차순으로 이루어진다고 할 때, 가능한 수열의 경우의 수를 구하세요.
입력
N(원소의 갯수, 2 <= N <= 5,000,000)
Ai(평균의 값, 0 <= Ai <= 1,000,000,000)
3
2
5
9
출력
4
카테고리
#수학
시간 복잡도 상한
O(N)
해결 방법
- 먼저 맨 앞의 숫자가 결정되면 이후의 숫자들은 한번에 구해진 다는 것을 확인합니다.
- 예제에서 첫번째 수가 1로 정해진다면, {1, 3, 7, 11} 하나의 경우밖에 없습니다.
- 그리고 원래 수열이 비내림차순이어야 되기 때문에, 두 번째로 올 수 있는 수 X2는 A1 <= X2 <=A2까지의 범위를 가집니다.
- X2가 A1보다 작은 경우, 평균을 맞추려면 X1이 X2보다 커야합니다.
- X2가 A2보다 큰 경우도 마찬가지로 X2가 X3보다 커지게 됩니다.
- X3의 범위는 A3 * 2 - A2 <= X3 <= A3 * 2 - A1가 됩니다.(2와 같은 이유입니다.)
- 그러나 조심해야 할 것은, 3번에서 구한 범위 중, 내림차순의 경우가 발생 할 수 있습니다.
- 역순이 발생하는 경우는 상한의 범위가 평균을 초과할 때 발생합니다.
- 3에서 보면 A3 * 2 - A1이 A3보다 큰 경우입니다.
- 이런 경우, A3을 상한으로 보정해주면 됩니다.
- 처음에 쉽게 생각하고 풀었을 때 틀렸던 테스트케이스는 아래와 같습니다.
7
2
5
7
8
9
12
14
15
정답 : 1
시간복잡도
O(N)
코드
#include<iostream>
using namespace std;
int n,x,y,i,s,a,b;
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>x>>y;
a=y;b=y*2-x;
for(i=2;i<n;i++){
x=y;
cin>>y;
a=2*y-a;
b=max(2*y-b,y);
swap(a,b);
}
cout<<max(b-a+1,0);
}
'PS' 카테고리의 다른 글
[백준]The Other Way(14554) (0) | 2020.10.29 |
---|---|
[백준]물대기(1368) (0) | 2020.10.24 |
[백준]무한이진트리(2078) (0) | 2020.10.02 |
[백준]기업투자(2662) (0) | 2020.09.27 |
[백준]대한민국(3770) (0) | 2020.09.27 |
Comments