题目描述好长0-0,看的好累。
看完题目,在草稿纸上写了 dfs bfs 爆搜几个字。一想爆搜也就26^5次循环。于是就写了,写完觉得可能数据会有坑过不了,但是没想到31MS过了。
看完题目,在草稿纸上写了 dfs bfs 爆搜几个字。一想爆搜也就26^5次循环。于是就写了,写完觉得可能数据会有坑过不了,但是没想到31MS过了。
看到有人用dfs写了0MS过了。
http://blog.csdn.net/vsooda/article/details/7996922
另外,这道题目可以学的比较基础的地方就是 字符和整数 之间的转换吧,以及代码书写的优美性。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll __int64
int num[30];
int cal(int v,int w,int x,int y,int z)
{
return v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
}
bool cmp(int a,int b)
{
return a>b;
}
void sovle(int len,int t)
{
for(int i=0;i<len;i++)
{
for(int j=0;j<len;j++)
{
if(i==j) continue;
for(int k=0;k<len;k++)
{
if(k==j||k==i) continue;
for(int m=0;m<len;m++)
{
if(m==i||m==j||m==k) continue;
for(int n=0;n<len;n++)
{
if(n==i||n==j||n==k||n==m) continue;
if(cal(num[i],num[j],num[k],num[m],num[n])==t)
{
printf("%c%c%c%c%c\n",num[i]+64,num[j]+64,num[k]+64,num[m]+64,num[n]+64);
return ;
}
}
}
}
}
}
printf("no solution\n");
}
int main()
{
int t;
char s[30];
while(~scanf("%d%s",&t,s))
{
if(t==0 && (!strcmp(s,"END")))
break;
int len=strlen(s);
for(int i=0;i<len;i++)
{
num[i]=s[i]-64;
}
sort(num,num+len,cmp);
sovle(len,t);
}
return 0;
}