BOJ 28703 - Double It

image.png

우선, AA에서 가장 큰 수는 22를 곱할 일이 없다.

그렇다고 하자.

a<ba < b 가 있을 때, 2b2b 와 더 가까워지기 위해서는 aa2a,4a,8a,2a, 4a, 8a, \dots 처럼 커져야하는데, 어떤 경우에도 nbnabanb-na \ge b-a 이기 때문에 모순이다.

따라서 Max(A)\text{Max}(A) 를 기준으로 삼고 나머지 모든 수들은 AA 이하까지만 22배를 하거나 거기서 딱 한 번 더 22배를 하거나이다.

이는 AA 이하까지 두배를 한 것들을 정렬해서 한 번씩 곱해주며 모두 비교하는 것으로 정답을 O(nlogn)O(n\log n) 에 구할 수 있다.

void solve() {  
   int n;  
   cin >> n;  
   if (n == 1) {  
      cout << 0;  
      return;  
   }  
   vi a(n);  
   fv(a);  
   sort(all(a));  
   for (int i = 0; i < sz(a) - 1; i++)  
      while (a[i] * 2 <= a.back()) a[i] *= 2;  
   sort(a.begin(), a.end() - 1);  
   int ans = a.back() - a.front();  
   deque<int> b(all(a));  
   for (int i = 0; i < sz(a) - 1; i++) {  
      b.pb(b.front() * 2);  
      b.pop_front();  
      mina(ans, b.back() - b.front());  
   }  
   cout << ans;  
}

Tags:

Categories:

Updated:

Comments