POJ 1248 - Safecracker
http://poj.org/problem?id=1248
概要
ターゲットの整数 \(T\) と,相異なる大文字のアルファベットの列 \(W\) が与えられる. \(W\) に含まれる大文字のアルファベットについて,\(A = 1, B = 2, \cdots, Z = 26\) と整数を関連付ける.
\(v - w ^ 2 + x ^ 3 - y ^ 4 + z ^ 5 = T\) となるように相異なる \((v, w, x, y, z)\) を \(W\) から選んだとき, その中で辞書順が最も遅いものを答える. ただしそのような5つ組が存在しないときは「no solution」と答える.
制約
- \(5 \le W \mbox{の長さ} \le 12\)
解法
5つ組の組み合わせは \(\begin{eqnarray}{}_{12}\mathrm{P}_5\end{eqnarray} = 95040\) 通りしかないので全探索.
poj/1248.cc1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int f(const string& s) 6 { 7 int n = 0; 8 for (int i = 0; i < 5; i++) { 9 int x = -1; 10 for (int j = 0; j <= i; j++) { 11 x *= -(s[i]-'A'+1); 12 } 13 n += x; 14 } 15 return n; 16 } 17 18 int main() 19 { 20 int N; 21 string s; 22 while (cin >> N >> s && N != 0) { 23 sort(s.rbegin(), s.rend()); 24 do { 25 if (f(s) == N) { 26 cout << s.substr(0, 5) << endl; 27 goto NEXT; 28 } 29 reverse(s.begin()+5, s.end()); 30 } while (prev_permutation(s.begin(), s.end())); 31 cout << "no solution" << endl; 32 NEXT: 33 ; 34 } 35 return 0; 36 }