1079 Total Sales of Supply Chain
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1079 Total Sales of Supply Chain相关的知识,希望对你有一定的参考价值。
1. 这道题考察的是树的层次遍历,结点需要有层这个属性,对于我来说,难点在于什么时候给层赋值,看书后知道应该是在加入队列之前(不管是根节点还是之后所有节点)。
2. 一开始算得216,原因是把r直接加一当作底数,其实中间商没有那么黑。。。应该是除以100再加1当作底数。
AC代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;
using namespace std;
const int maxn = 100010;
int n;//结点总数
double initPrice,rate;//出厂价和利率
struct Node{
int layer = 0;
double price;
vector<int> children;
int amount;
}node[maxn];
bool appear[maxn] = {false};//用于寻找根节点
int findRoot(){
for(int i=0;i<n;i++){
if(!appear[i])return i;
}
}
double layerOrder(int root){
double sum = 0;
queue<int> que;
que.push(root);
while(!que.empty()){
int top = que.front();
que.pop();
int childN = node[top].children.size();//当前结点的叶子结点数量
if(childN){//说明不是叶子结点
for(int i=0;i<childN;i++){
int childI = node[top].children[i];
node[childI].layer = node[top].layer+1;
que.push(childI);
}
}else{//是叶子结点
sum += initPrice*node[top].amount*pow(rate/100+1,node[top].layer);
}
}
return sum;
}
int main(){
scanf("%d %lf %lf",&n,&initPrice,&rate);
int childrenN,childIdx,amount;
for(int i=0;i<n;i++){
scanf("%d",&childrenN);
if(childrenN){//说明不是叶子结点
while(childrenN--){
scanf("%d",&childIdx);
appear[childIdx] = true;
node[i].children.push_back(childIdx);
}
}else{
scanf("%d",&amount);
node[i].amount = amount;
}
}
int root = findRoot();
double ans = layerOrder(root);
printf("%.1f",ans);
return 0;
}
以上是关于1079 Total Sales of Supply Chain的主要内容,如果未能解决你的问题,请参考以下文章