PAT_甲級_1079 Total Sales of Supply Chain

題目大意:

給出一顆銷售供應樹,根結點爲0,在樹根處售價爲P,而後從根節點開始,每一層的貨物的價格就會在上一層的價格上增長r%,給出每一個葉結點的貨物量,要求計算全部葉結點的銷售總額。node

算法思路:

此題本質上考察的是樹的遍歷,該樹是由供應商做爲根節點,經銷商做爲子節點,零售商做爲葉子節點組成。想要求葉子節點的銷售總額,只須要求出葉子節點的售價,爲此,咱們只須要從根節點遍歷該樹,計算全部節點的售價,這樣在遍歷到葉子節點的時候就能夠直接累計總售價。使用先序遍歷或者層序遍歷都是能夠的,這裏採用了先序遍歷的方法,代碼以下所示:算法

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);
    }
}

注意點:

  • 一、使用float保存數據會有好幾個點沒法經過。

提交結果:

image.png

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;
}
相關文章
相關標籤/搜索