Hduoj1015【水题】

#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\n", ans[0]+64, ans[1]+64, ans[2]+64, ans[3]+64, ans[4]+64);
		else
		printf("no solution\n");
	}
	return 0;
}


题意:给出5~12个不同的大写字母组成的字符串,并且给定一个目标值,规定A~Z的值为1~26, 从该字符串中挑出5个字母组成一个字符串vwxyz,要求v - w^2 + x^3 - y^4 + z^5 = target。如果有多个符合要求的字符串,则输出字典序最大的那个。否则输出no  solution。

思路:此题可以直接暴力求解,先将给出的字符串的值保存到数组中,然后对数组进行降序排序,接着5个for循环求出这5个字符。

你可能感兴趣的:(c)