Hduoj 1015【水題】
1785 ワード
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[15];
int num, ok, s[15], vis[30], n, ans[5];
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int power(int x,int y)
{
int i;
i = x;
while(--y)
{
x *= i;
}
return x;
}
void dfs()
{
int i, j, k, l, m;
for(i = 0; i < n; ++i)
{
vis[i] = 1;
for(j = 0; j < n; ++j)
{
if(vis[j])
continue;
vis[j] = 1;
for(k = 0; k < n; ++k)
{
if(vis[k])
continue;
vis[k] = 1;
for(l = 0; l < n; ++l)
{
if(vis[l])
continue;
vis[l] = 1;
for(m = 0; m < n; ++m)
{
if(vis[m])
continue;
if(s[i] - power(s[j], 2) + power(s[k], 3) - power(s[l], 4) + power(s[m], 5) == num)
{
ok = 1;
ans[0] = s[i];
ans[1] = s[j];
ans[2] = s[k];
ans[3] = s[l];
ans[4] = s[m];
return;
}
}
vis[l] = 0;
}
vis[k] = 0;
}
vis[j] = 0;
}
vis[i] = 0;
}
}
int main()
{
int i, j, k;
while(scanf("%d %s", &num, str) != EOF)
{
if(num == 0 && strcmp(str, "END") == 0)
break;
n = strlen(str);
for(i = 0; i < n; ++i)
s[i] = str[i] - 64;
ok = 0;
qsort(s, n, sizeof(s[0]), cmp);
memset(vis, 0, sizeof(vis));
dfs();
if(ok)
printf("%c%c%c%c%c
", ans[0]+64, ans[1]+64, ans[2]+64, ans[3]+64, ans[4]+64);
else
printf("no solution
");
}
return 0;
}
題意:5~12個の異なる大文字からなる文字列を与え、目標値を与え、A~Zの値を1~26と規定し、この文字列から5個の文字列vwxyzを選択して1つの文字列vwxyzを構成し、v-w^2+x^3-y^4+z^5=targetを要求する.要求に合致する文字列が複数ある場合は、辞書順が最も大きい文字列を出力します.そうでなければno solutionを出力します.
構想:この問題は直接暴力的に解くことができて、先に与えた文字列の値を配列の中に保存して、それから配列に対して降順の順序を行って、それから5つのfor循環はこの5つの文字を求めます.