解いた問題

8/23/2012

SRM436 Div2 Hard

1000

x[i] != y[i] なインデックスを見つけて、それ以下を x[i], y[i] と逆の大小関係になるようにする。
自前のBigIntは略。



  1. BigInt f(string a, string b, int idx, int S)  
  2. {  
  3.   const int N = a.size();  
  4.   
  5.   if (a[idx] < b[idx]) ; else {  
  6.     swap(a[idx], b[idx]);  
  7.     --S;  
  8.   }  
  9.   for (int i = idx + 1; i < N && S; ++i) {  
  10.     if (a[i] < b[i]) {  
  11.       swap(a[i], b[i]);  
  12.       --S;  
  13.     }  
  14.   }  
  15.   
  16.   for (int i = 0; i < N; ++i) {  
  17.     if (a[i] == b[i]) return BigInt(a) * BigInt(b);  
  18.   }  
  19.   if (S % 2) swap(a[N - 1], b[N - 1]);  
  20.   return BigInt(a) * BigInt(b);  
  21. }  
  22.   
  23. class DigitsSwap {  
  24. public:  
  25.   string maximalProduct(string x, string y, int swaps)  
  26.   {  
  27.     if (swaps == 0) return (BigInt(x) * BigInt(y)).toString();  
  28.   
  29.     const int N = x.size();  
  30.     int idx = -1;  
  31.   
  32.     for (int i = 0; i < N; ++i) {  
  33.       if (x[i] != y[i]) {  
  34.         idx = i;  
  35.         break;  
  36.       }  
  37.     }  
  38.     if (idx == -1) return (BigInt(x) * BigInt(y)).toString();  
  39.   
  40.     BigInt a = f(x, y, idx, swaps);  
  41.     BigInt b = f(y, x, idx, swaps);  
  42.   
  43.     if (a < b) return b.toString();  
  44.     else return a.toString();  
  45.   }  
  46. };