一道枚举的题目,根据公式,五重循环....
有个优化剪枝的地方的五个未知量不可能相等。可以略去不少的运算
pass:一开始WR的原因是pow函数的使用,来回用到强制类型转换来改变数据的类型使得出现数据的精度误差,没有AC。T-T
然后采用最原始的连乘式过了......
有个优化剪枝的地方的五个未知量不可能相等。可以略去不少的运算
pass:一开始WR的原因是pow函数的使用,来回用到强制类型转换来改变数据的类型使得出现数据的精度误差,没有AC。T-T
然后采用最原始的连乘式过了......
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
bool cmp(int a,int b)
{
return a > b;
}
int main()
{
void judge(int len,int value[],int key);
int n,len;
char data[15];
int value[15];
while(cin>>n>>data && n && strcmp("END",data))
{
// cout<<n<<" "<<data<<endl;
len = strlen(data);
for(int i = 0 ; data[i] != '\0' ; i++)
{
value[i] = data[i] - 'A' + 1;
}
sort(value,value+len,cmp);
/* for(int i = 0 ; i < len ; i++)
{
cout<<value[i]<<" ";
}*/
judge(len,value,n);
}
return 0;
}
void judge(int len,int value[],int key)
{
for(int a = 0 ; a < len ; a++)
{
for(int b = 0 ; b < len ; b++)
{
if(a!=b)
{
for(int c = 0 ; c < len ; c++)
{
if(a!=c && b!=c)
{
for(int d = 0 ; d < len ; d++)
{
if(a!=d && b!=d && c!=d)
{
for(int e = 0 ; e < len ; e++)
{
if(a!=e && b!=e && c!=e && d!=e)
{
if(value[a] - value[b]*value[b] + value[c]*value[c]*value[c] - value[d]*value[d]*value[d]*value[d] + value[e]*value[e]*value[e]*value[e]*value[e] == key)
{
printf("%c%c%c%c%c\n",value[a]+'A'-1,value[b]+'A'-1,value[c]+'A'-1,value[d]+'A'-1,value[e]+'A'-1);
return;
}
}
}
}
}
}
}
}
}
}
printf("no solution\n");
}
/*将字母转化为对应的数字,套取公式进行判断。*/
/*字典序输出最后一项的技巧*//*将字母转化过来的数字降序进行排列,这样得到的第一组情况的解即为字典序下的最后一组解*/
/*特殊限制。每个解的五个值不相等,可以减少枚举情况*/