HDU 1601(Galactic Import)

题意:

       若干行星之间有运输通道,其中一些行星到地球有运输通道,每个行星的产品有自己的价值。行星向地球运输产品时,如果能直达地球,则可以将所有产品运往地球;如果需要路过其他行星,则每路过一颗行星,产品减少当前的 5%。计算从哪个行星向地球运送产品,获得的价值最大。

方法:

       由于行星数量很少,所以暴力破解即可。首先计算每个行星到达地球最少需要经过几个其他行星,然后计算每个行星向地球运送产品可获得的价值,选择最大价值的行星即可。

#include 
#include 
#include 
using namespace std;
const int MAXN = 30;
const double percent = 0.95; //每经过一颗行星,产品数变成当前的95%

struct Planet //行星
{
	char name; //行星名
	double value; //价值
	char to[MAXN]; //能到达的行星
	int num; //到达地球最少需要经过的行星数(直达为0,不可达为-1)
}p[MAXN];

map mp; //行星名对应的行星在p[MAXN]数组中的位置

int main()
{
	int N;
	while (scanf("%d", &N) != EOF)
	{
		getchar(); //读取换行符
		for (int i = 0; i < N; i++)
		{
			scanf("%c %lf", &p[i].name, &p[i].value);
			mp[p[i].name] = i;
			p[i].num = -1; //初始记为-1

			getchar(); //读取空格
			int j = 0;
			char c;
			while ((c = getchar()) != '\n') //读入可直达的行星
			{
				if (c == '*') //可直达地球
				{
					p[i].num = 0;
				}
				else //可达其他行星
				{
					p[i].to[j++] = c;
				}
			}
			p[i].to[j] = '\0';
		}

		int number = 0; //当前需要经过的行星数量
		bool flag = true; //是否存在到达地球经过number个行星的行星
		while (flag)
		{
			flag = false;
			for (int i = 0; i < N; i++)
			{
				if (p[i].num == number)
				{
					flag = true;
					for (int j = 0; p[i].to[j] != '\0'; j++)
					{
						if (p[mp[p[i].to[j]]].num == -1)
						{
							p[mp[p[i].to[j]]].num = number + 1;
						}
					}
				}
			}
			++number;
		}

		double maxValue = 0; //最大价值
		char ans;
		for (int i = 0; i < N; i++) //计算可达地球的每个行星的价值
		{
			if (p[i].num != -1)
			{
				double value = p[i].value * pow(percent, p[i].num);
				if (value > maxValue)
				{
					maxValue = value;
					ans = p[i].name;
				}
				else if (value == maxValue && p[i].name < ans)
				{
					ans = p[i].name;
				}
			}
		}

		printf("Import from %c\n", ans);
	}
	return 0;
}

继续加油。

你可能感兴趣的:(HDU)