Link

https://www.acmicpc.net/problem/12931

Detail

0인 배열을 만들어서 목표치를 만드는 것과 역산하는 것이 같다고 판단 되어, 입력배열을 0으로 만드는 문제로 재 해석했다.

단순하게 생각해서, 연산횟수의 최소화가 목표라면 반으로 나누는 행위를 최대한 많이 반복하면 된다. 각 원소의 값을 홀수라면 1씩 빼서, 반으로 나누는 연산을 최대한 활용하면 답을 구할 수 있다.

N이 50이하 이므로 반으로 나누는 연산 없이 1000번 빼더라도 시간초과는 나지 않는다.

Code

#include<bits/stdc++.h>
 
using namespace std;
 
int N;
vector<int> A;
 
bool is_full_zero() {
    for(int x : A) {
        if(x != 0) return false;
    }
    return true;
}
 
int solution() {
   int ret = 0;
 
   while(not is_full_zero()) {
        for(int i = 0; i < N; i++) {
            if(A[i] % 2 == 1) {
                A[i]--;
                ret++;
            }    
        }
 
        if(is_full_zero()) break;
        
        for(int& i : A) {
            i /= 2;
        }
        ret++;
   } 
 
   return ret;
}
 
int main() {
    cin >> N;
    A.resize(N);
    for(int& x : A) cin >> x;
 
    cout << solution() << endl;
}