PAT_A1079
PAT甲级1079.
目录
A1079
题目
样例
输入:
10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
输出:
42.4
思路和坑点
本题考查多叉树的层序遍历,对给出的结果建树。然后层序遍历,并记录层数,对于零售商来说,其销售额销售额=p*(1+r%)^layer
,其中layer代表零售商结点所在的层数。(根结点的层数为0)
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct node{ //多叉树结点结构体
int tag; //-1表示不是零售商,不是-1则表示零售商货物储量
vector<int> child; //孩子数组
}Node;
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n;
double p,r;
scanf("%d%lf%lf",&n,&p,&r); //读入参数
r=1+r/100; //直接将r换算成价格p的倍数
vector<Node> v(n);
for(int i=0;i<n;i++){
int num;
scanf("%d",&num);
if(num==0) scanf("%d",&v[i].tag); //如果是零售商读入货物储量
else{
v[i].tag=-1; //如果不是零售商,标记为-1
for(int j=0;j<num;j++){ //读入其孩子序号
int temp; scanf("%d",&temp);
v[i].child.push_back(temp);
}
}
}
queue<int> q; //使用队列进行层次遍历
int layer=0,last=0,tail=0; //layer记录层数,last记录当前层的最后一个,tail用于在当前层结束后更新last
double sum=0; //统计总销售额
q.push(0);
while(!q.empty()){
int now=q.front(); //从队列中读出一个元素
q.pop();
int size=v[now].child.size();
for(int i=0;i<size;i++){ //将孩子依次入队
q.push(v[now].child[i]);
tail=v[now].child[i];
}
if(v[now].tag!=-1) //如果当前节点是零售商,累加销售额
sum+=v[now].tag*p*pow(r,layer);
if(now==last){ //当前层结束后,层数增加,更新last
layer++;
last=tail;
}
}
printf("%.1f",sum); //输出结果
return 0;
}