
Code

/**//*
2008-12-26 18:32:43 Accepted 1015 31MS 0K 1171 B
一道简单题
A=1, B=2,
, Z=26
然后给你一个目标值和一串大写字符串,从传中找出5个字母,构成
能满足公式 v - w^2 + x^3 - y^4 + z^5 = target 的最大字典顺序串
我看没多少人超时就直接用了枚举,复杂度是O(n^5)
为了省时间,我把各字母的权值先用数组保存起来,结果时间从203ms减到31ms
应该还可以剪枝,我看别人都是0ms的
*/
#include<iostream>
#include<cmath>
char str[28];
long tar,len;
char res[6];
long pw[27][5];
bool init()


{
scanf("%ld %s",&tar,str);
if(tar==0)
return 0;
memset(res,0,sizeof(res));
len=strlen(str);
for(int i=0;i<len;i++)
str[i]-='A';
return 1;
}
void mkPw()


{

for(int i=0;i<26;i++)
for(int j=0;j<5;j++)
pw[i][j]=pow(i+1,j+1);
}

void mkRes()


{
char tmp[6];
for(int i=0;i<len;i++)
for(int j=0;j<len;j++)

{
if(j==i) continue;
for(int k=0;k<len;k++)

{
if(k==j || k==i) continue;
for(int m=0;m<len;m++)

{
if(m==k || m==j || m==i) continue;
for(int n=0;n<len;n++)

{
if(n==m || n==k || n==j || n==i) continue;
if((pw[str[i]][0]-pw[str[j]][1]+pw[str[k]][2]-pw[str[m]][3]+pw[str[n]][4])==tar)

{
tmp[0]=str[i]+'A';tmp[1]=str[j]+'A';tmp[2]=str[k]+'A';tmp[3]=str[m]+'A';tmp[4]=str[n]+'A';tmp[5]='\0';
if(strcmp(tmp,res)>0)
strcpy(res,tmp);
}
}
}
}
}
}

int main()


{
while(init())

{
mkPw();
mkRes();
if(!res[0])
puts("no solution");
else
puts(res);
}
return 0;
}
posted @
2008-12-26 18:49
sunjian
阅读(
312)
评论()
收藏
举报