题意是在一段大写英文字符中找出 5 个字符通过代入公式运算得到目标值,如有多组字符满足题意,则输出字典序最大的一组,否则输出 no solution。
应该是用深搜做的,但是直接暴力也过了……(应该没有比下面更朴实的算法了......)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 std::ios::sync_with_stdio(false); 6 __int64 aim,tmp; 7 string s,w; 8 bool f; 9 w = "wxjin"; 10 while(cin >> aim) 11 { 12 cin >> s; 13 f = true; 14 if(aim == 0 && s == "END") break; 15 int len = s.length(); 16 tmp = 0; 17 for(int i = 0; i < len; i++) 18 s[i] = s[i] - 'A' + 1; 19 for(int i = 0; i < len; i++) 20 for(int u = 0; u < len; u++) 21 for(int p = 0; p < len; p++) 22 for(int l = 0; l < len; l++) 23 for(int k = 0; k < len; k++) 24 if(i!=u && i!=p && i!=l && i!=k) 25 if(i!=u && u!=p && u!=l && u!=k) 26 if(p!=u && i!=p && p!=l && p!=k) 27 if(l!=u && l!=p && i!=l && l!=k) 28 if(k!=u && k!=p && k!=l && i!=k) 29 if(s[i]-s[u]*s[u]+s[p]*s[p]*s[p]-s[l]*s[l]*s[l]*s[l]+s[k]*s[k]*s[k]*s[k]*s[k]== aim) 30 { 31 if(tmp < s[i]*10000+s[u]*1000+s[p]*100+s[l]*10+s[k]) 32 { 33 w[0] = s[i],w[1] = s[u],w[2] = s[p],w[3] = s[l],w[4] = s[k]; 34 f = false; 35 tmp = s[i]*10000+s[u]*1000+s[p]*100+s[l]*10+s[k]; 36 } 37 } 38 39 if(f) cout << "no solution" << endl; 40 else cout << (char)(w[0]+'A'-1) << (char)(w[1]+'A'-1) << (char)(w[2]+'A'-1) << (char)(w[3]+'A'-1) << (char)(w[4]+'A'-1) << endl; 41 } 42 return 0; 43 }