关于算法-数据结构:PAT甲级1079-Total-Sales-of-Supply-Chain

31次阅读

共计 1379 个字符,预计需要花费 4 分钟才能阅读完成。

题目粗心:

给出一颗销售供给树, 根结点为 0, 在树根处售价为 P, 而后从根节点开始, 每一层的货物的价格就会在上一层的价格上减少 r%, 给出每个叶结点的货物量, 要求计算所有叶结点的销售总额。

算法思路:

此题实质上考查的是树的遍历,该树是由供应商作为根节点,经销商作为子节点,零售商作为叶子节点组成。想要求叶子节点的销售总额,只需要求出叶子节点的售价,为此,咱们只须要从根节点遍历该树,计算所有节点的售价,这样在遍历到叶子节点的时候就能够间接累计总售价。应用先序遍历或者层序遍历都是能够的,这里采纳了先序遍历的办法,代码如下所示:

double total_sales = 0 ;// 总售价
void preTraverse(int root,double r){if(node[root].child.empty()){
        // 零售商,计算总售价
        total_sales += node[root].price*node[root].total_amount;
        return;
    }
    double distributor_price = node[root].price*(1+r/100);
    for (auto &item:node[root].child){node[item].price = distributor_price;
        preTraverse(item,r);
    }
}

留神点:

  • 1、应用 float 保留数据会有好几个点无奈通过。

提交后果:

AC 代码:

#include <cstdio>
#include <vector>

using namespace std;

struct Node{
    vector<int> child;// 该结点的孩子
    int total_amount;// 叶子结点的货品数量
    double price;// 以后结点的售价
}node[100005];

double total_sales = 0 ;// 总售价
void preTraverse(int root,double r){if(node[root].child.empty()){
        // 零售商,计算总售价
        total_sales += node[root].price*node[root].total_amount;
        return;
    }
    double distributor_price = node[root].price*(1+r/100);
    for (auto &item:node[root].child){node[item].price = distributor_price;
        preTraverse(item,r);
    }
}

int main()
{
    int N;// 供应链总人数
    double P,r;// 供应商的单价,增量
    scanf("%d %lf %lf",&N,&P,&r);
    int K,id;
    for (int i = 0; i < N; ++i) {scanf("%d",&K);
        if(i==0){
            // 供应商
            node[i].price = P;
        }
        if(K==0){
            // 零售商
            scanf("%d",&id);
            node[i].total_amount = id;
        } else {
            // 经销商和供应商
            for (int j = 0; j < K; ++j) {scanf("%d",&id);
                node[i].child.push_back(id);
            }
        }
    }
    preTraverse(0,r);
    printf("%.1lf",total_sales);
    return 0;
}

正文完
 0