-
백준 19539(사과나무)전공/알고리즘 2020. 7. 30. 20:08
ㅜhttps://www.acmicpc.net/problem/19539
2020ucpc H번 문제
쉬는데 갑자기 계속 생각이 나길래 좀 더 생각을 해보니깐 알것 같다.
일단 문제는 단순하다.
2만큼 자라게 하는 물과
1만큼 자라게 하는 물을 무조건 하루에 다 써야 한다.
주어진 나무의 길이를 모두 어떤 하루가 지났을 때에 도달할 수 있느냐
물을 한 나무에 모두 부어도 괜찮다.
그러면 하루에 3만큼 자라게 해주어야하고 특정일이 도달했을때에는 3*n만큼의 길이가 된다.
따라서 만약에 목표 나무길이들의 합이 3의 배수가 아니라면 실패.
(조건1)
결과를 봤을때로 가자
2와 1은 동일 갯수로 쓰인다.
며칠을 부어야 완성되는지 알면 2와 1이 얼마나 쓰이는지 쉽게 알 수 있다.
총 나무의 길이 / 3 이 걸리는 일수이고,
따라서 2를 붓는 횟수도 위의 일수와 동일하다
그런데 여기서 2를 부울수 있는 횟수만 확인하면 되는데 그 이유는 1은 어떤 높이여도 상관없는 그러니깐 나무 길이의 최소단위와 같으므로 2를 부울수 있는 횟수가 전체를 지배한다.
따라서 2를 부울수 있는 전체횟수가 일수보다 크거나 같으면 만들 수 있게된다.
만약 여기서 물이 2와 1이 아닌 3과 2라고 한다면
훨씬 생각할게 많아지는 것 같다. 그래서 생각을 깊게 해보지는 않았다.
여기서 중요했던 포인트는 주어진 직접정보를 우리가 더 쉽게 인지할 수 있는 정보로 바꾸는 과정이다.
총 걸리는 일수가 2를 붓는 횟수이고, 2를 부울 수 있는 횟수가 총 걸리는 일수보다 크거나 같다는게 이 문제의 풀이 과정이니깐.
머신러닝에서도 이런 과정을 거친다. 우리가 직접 모델을 선정하기 앞서서 정보들을 시각화하고, 합치고, 값을 조정하고 함으로써 우리에게 또 다른 새롭게 다가오는 정보를 만들 수 있는 것이다.
#include<iostream> using namespace std; int N, sum, sum_2; int main() { cin >> N; for (int i = 0; i < N; i++) { int a; cin >> a; sum += a; sum_2 += (a / 2); } if (sum % 3 == 0) { if (sum_2 >= (sum / 3)) { cout << "YES\n"; return 0; } else { cout << "NO\n"; return 0; } } else { cout << "NO\n"; } }
'전공 > 알고리즘' 카테고리의 다른 글
백준 1817(짐 챙기는 숌) (0) 2020.07.31 백준 9576(책 나눠주기) (0) 2020.07.31 백준 1700(멀티탭 스케줄링) (0) 2020.07.29 백준 1967(트리의 지름) dp (0) 2020.07.20 백준 11054(가장 긴 바이오닉 부분 수열) (1) 2020.07.17