반응형
이번 문제는 N명의 학생들이 있는데, 학생들이 원형으로 둘러 앉아있습니다. 각 학생들은 사탕을 가지고 있는데, 우리가 알고 있는 것은 이웃한 두 학생들의 사탕의 합만을 알고 있습니다. 이 때, N명은 홀수라는 것이 중요합니다.
이 문제는 N이 홀수가 아니라면 풀기 어려운 문제가 됩니다.
각 학생들이 가지고 있는 사탕의 개수를 \(c_i\)라고 하자, 그리고 \(c_i + c_{i+1}\)을 \(s_i\)라고 하자. 참고로 \(c_{N+1} = c_1\)로 규정하도록 한다. 그러면 다음과 같은 식을 만들 수 있다.
\[ \sum_{i=1}^{N} (-1)^{i+1} s_i = 2c_1 \]
만약 짝수의 학생들이 있었다면, 위식은 0이 된다. 예를 들어서 5명의 학생이 사탕을 2, 3, 1, 4, 3개씩 가지고 있다면, 이웃한 두 학생의 합은 5, 4, 5, 7, 5 로 표현할 수 있다. 위의 식에 따라서 우리가 계산을 하면, 첫번째 학생의 사탕의 개수는 \( (5-4+5-7+5)/2 = 2 \)가 된다. 그러면, 첫번째 학생의 사탕의 개수를 알았으니, 차례대로 이전 학생의 사탕개수를 빼주면 된다. 두번째 학생은 3개, 세번째 학생은 1개, 네번째 학생은 4개, 다섯번째 학생은 3개가 됩니다.
제가 작성한 소스입니다. 소스는 참고용으로 봐주세요.
//--------------------------------------------------------------
// baekjoon #1812
// - by Aubrey Choi
// - created at 2019-07-31
//--------------------------------------------------------------
#include <stdio.h>
int main()
{
int n, f=0;
int v[999];
scanf("%d", &n);
for(int i=0; i < n; i++)
{
scanf("%d", v+i);
f += (i&1)?-v[i]:v[i];
}
f/=2;
printf("%d\n", f);
for(int i=0; i < n-1; i++)
{
f = v[i]-f;
printf("%d\n", f);
}
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
백준 #1849 순열(세그먼트 트리) (0) | 2022.10.25 |
---|---|
[C/C++] 백준 #1822 차집합(집합) (0) | 2022.10.23 |
[C/C++] 백준 #1806 부분합(두 포인터) (0) | 2022.10.22 |
[C/C++] 백준 #1790 수 이어쓰기 2(수학) (0) | 2022.10.22 |
[C/C++] 백준 #1789 수열의 합(수학) (0) | 2022.10.22 |
댓글