1248 Safecracker
問題概要
鍵は、入力文字列から異なる5文字を任意の順番で選び、
A=1,B=2...Z=26で整数を対応させて、v,w,x,y,zとしたときに
v - w2 + x3 - y4 + z5 = target
の式を満たすようなもののうち、最も辞書順で最後に来るものである。
入力文字列およびtargetが与えられるとき、鍵を求めよ。
解法
全探索。枝刈り全くなしで通る。
ソースコード
int t,n; char in[30]; char ans[6],tmp[6]; void solve(int c,int sum) { if(c<0) { if(sum==t&&strcmp(tmp,ans)>0)strcpy(ans,tmp); return; } for(int i=n-1;i>=0;i--)if(in[i]) { tmp[c]=in[i]; in[i]=0; //int s=0; rep(j,c+1)s+=(int)pow(26,j+1.0); //if(abs(s)>=abs(t-sum)) solve(c-1,sum-(int)pow(-tmp[c]+'A'-1,c+1.0)); in[i]=tmp[c]; } } int main() { while(scanf("%d%s",&t,in),t!=0||strcmp(in,"END")) { ans[0]=0; n=strlen(in); sort(in,in+n); solve(4,0); puts(ans[0]?ans:"no solution"); } return 0; }