题目翻译及解读:
商品供应链是由 零售商、经销商和供应商构成,其中每一个都参与了商品从供应商到消费者的流通过程。
从一个供应商开始,供应链的成员都是以价格P从供应商处购买,并以高出P的r%的价格进行分销或者贩卖。且只有零售商会和消费者直接进行交易。这里我们假设供应链的每个成员除了根节点供应商外就只有一个其他供应商,并且这里并不存在供应循环的关系。
现在,给出一条供应链,你需要设法求出所有零售商的售卖总额。
输入格式:
每个输入文件包含一个测试案例。每个测试案例,第一行具有三个正整数:N<=100000,即供应链的所有成员(因此,成员们的ID编码从0到N-1编号,注意根节点供应商的ID被设置为了0);P,根节点供应商的单个商品价格;r,每级售销的提高比例。
接下来N排输入将交代每个分销商或者零售商的情况:
Ki ID[1] ID[2] ... ID[Ki]
这里第i排,其中Ki代表从供应商i处进货的成员(分销商或零售商)的总数,随后列出成员ID。若Ki==0,就意味着这第i号成员是零售商,则Ki后列下该零售商的商品总数。所有的数字以空格间隔。
<注>:这里的i是从0开始,这里的经销商会成为进货者的供应商。实在对于这种题目需要自己揣摩其含糊的意思的题目没有好感,对i的定义我们也可以从ID [1] ID [2] ... ID [K i]来推断是从1开始的啊!!!经销商会转换身份为供应商,他本质是经销商、相对是供应商。这里描述为上一级供应商、上一级经销商,可是统称为供应商且并未表述相对关系,就容易误解存在其他供应商。
怪我菜,怪我菜……毕竟人家可以读对题,我就读不清。
我的代码:
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int n;
double p, r, tol = 0;
vector<vector<int> >vv;
void cnt(int tra, int level);
int main()
{
scanf("%d %lf %lf", &n, &p, &r);
for (int i = 0, m, t; i < n; i++)
{
vector<int>vt;
scanf("%d", &m);
vt.push_back(m);
if (m == 0)
{
scanf("%d", &t);
vt.push_back(t);
}
for (int j = 0; j < m; j++)
{
scanf("%d", &t);
vt.push_back(t);
}
vv.push_back(vt);
}
cnt(0, 0);
printf("%.1lf", tol);
return 0;
}
void cnt(int tra, int level)
{
if (vv[tra][0] == 0)
{
tol = tol + p * pow(1 + r / 100, level) * vv[tra][1];
return;
}
for (int i = 1; i < vv[tra].size(); i++)
cnt(vv[tra][i], level + 1);
return;
}