백준 19539(사과나무)
ㅜhttps://www.acmicpc.net/problem/19539
19539번: 사과나무
첫 번째 줄에 모든 나무가 갊자가 바라는 높이가 되도록 물뿌리개를 통해 만들 수 있으면 “YES”를, 아니면 “NO”를 따옴표를 제외하고 출력한다.
www.acmicpc.net
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";
}
}