题意:
若干行星之间有运输通道,其中一些行星到地球有运输通道,每个行星的产品有自己的价值。行星向地球运输产品时,如果能直达地球,则可以将所有产品运往地球;如果需要路过其他行星,则每路过一颗行星,产品减少当前的 5%。计算从哪个行星向地球运送产品,获得的价值最大。
方法:
由于行星数量很少,所以暴力破解即可。首先计算每个行星到达地球最少需要经过几个其他行星,然后计算每个行星向地球运送产品可获得的价值,选择最大价值的行星即可。
#include <cstdio>
#include <map>
#include <cmath>
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<char, int> 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;
}
继续加油。