题意:输入n,p,r,n是供应商个数,根供应商为0,p为从父节点买入价格,r为向子节点卖出价格增加的百分数,接下来n行:
第n行:K~i~ ID[1] ID[2] ... ID[K~i~]
K~i~ product
当K~i~不等于零,为第n个供应商卖出的对象即子节点数,接下来K~I~个ID为子节点编号。
当K~i~等于零,第n个编号为零售商,接下来的数为卖出产品数。
输出:零售商的总销售额,精确到小数点后一位
实现方法:
1.递归实现dfs
dfs(num[index].child[i],layer+1);
2.重点:结构体存储产品数int型和子节点vector型,再定义结构体型vector
3.当节点为叶节点,销售额增加,salesum += p * num[index].product*pow((1+r/100),layer);
注意:
1.输入n后num.resize(n),否则出错
2.销售额为double类型,输出格式为%.1f
3.r为百分数,需除100
#include<iostream>
#include<cmath>//pow函数
using namespace std;
#include<vector>
int n, ki, id,layer,i=0;
double p, r,salesum=0.0;
struct node//重点
{
int product;
vector<int> child;
};
vector<node> num;
void dfs(int index, int layer)
{
if (num[index].child.size() == 0)
{
salesum += p * num[index].product*pow((1+r/100),layer);
return;
}
for (int i = 0; i < num[index].child.size();i++)
{
dfs(num[index].child[i],layer+1);//递归
}
}
int main(void)
{
cin >> n >> p >> r;
num.resize(n);//注意 否则报错
for(int i=0;i<n;i++)
{
cin >> ki;
if (ki > 0)
{
while (ki--)
{
cin >> id;
num[i].child.push_back(id);
}
}
else
{
cin >> num[i].product;
}
}
dfs(0, 0);
printf("%.1f", salesum);//小数点后一位
system("PAUSE");
return 0;
}