Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- DynamicProgramming
- Euler path
- bitmask
- Sieve_of_Eratosthenes
- BST
- Segment Tree
- implementation
- Eulerian path
- mathematics
- Dag
- disjoint-set
- graph
- Algospot
- GCD
- Euler circuit
- CS Academy
- hashing
- Cycle detecting
- BOJ
- backtracking
- dynamic programming
- Eulerian circuit
- flows
- POJ
- Shortest path
- BFSDFS
- scc
- 백준
- Greedy
- graph modeling
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 2485 - 가로수 본문
재밌는 문제라 포스팅하고자 한다.
연속된 숫자 1,5,10 이라고 한다면 심어야할 나무는 1보다 작은 위치 또는 10을 넘어가는 위치에 심을 순 없다. 따라서 1-5 간격과 5-10 간격이 다르기 때문에 각 구간에 나무를 심어야되는데, 그 간격을 정해보는 것에 포커싱을 맞춰보자. 1-5 간격은 4, 5-10 간격은 5다. 따라서 2도 3도 4,5 모두 간격으로 둘 수 없다. 따라서 1간격으로 나무를 심을 수 밖에 없다.
반면 1,5,11 이라고 가정해보자. 1-5 간격은 4, 5-11 간격은 6이 된다. 따라서 2간격만큼 나무를 심어줄 수 있다.
모든 구간에 대해 같은 간격으로 나눠져야하기 때문에 최대공약수를 이용해 구한다.
모든 간격에 대해 최대공약수를 구하면 그것을 나눈 값 - 1로 답을 구할 수 있다.
#include <cstdio> #include <algorithm> using namespace std; int gcd(int a, int b) { int t; while (b) { t = a%b; a = b; b = t; } return a; } int main() { int N, *A,g,i,ans=0; scanf("%d", &N); A = new int[N]; for(i=0;i<N;i++) scanf("%d", &A[i]); sort(A, A + N); g = gcd(A[1] - A[0], A[2] - A[1]); for (i = 2; i < N - 1; i++) g = gcd(g, A[i + 1] - A[i]); for (i = 0; i < N - 1; i++) ans += (A[i + 1] - A[i]) / g - 1; printf("%d", ans); return 0; }
'Solved problems' 카테고리의 다른 글
BOJ 2731 - 1379와 세제곱 (0) | 2018.01.21 |
---|---|
BOJ 10978 - 기숙사 재배정 (0) | 2018.01.18 |
BOJ 2481 - 해밍 경로 (0) | 2018.01.17 |
BOJ 1111 - IQ Test (0) | 2018.01.16 |
BOJ 1415 - 사탕 (0) | 2018.01.16 |
Comments