PAT A1090 Highest Price in Supply Chain [树的遍历]

题目描述

链接
给一棵树,在树根处货物的价格为p,然后每往下走一层,价格增加r%,求所有叶子结点的最高价格,以及这个价格的叶子结点个数

分析

  • 关键在于dfs怎么设计来保存这个最大值,以及最大值的个数
    别人的代码如下,比较巧。。。还用了个maxnum。。我怎么没想到
void dfs(int index, int depth) {
    if(v[index].size() == 0) {
        if(maxdepth == depth)
            maxnum++;
        if(maxdepth < depth) {
            maxdepth = depth;
            maxnum = 1;
        }
        return ;
    }
    for(int i = 0; i < v[index].size(); i++)
        dfs(v[index][i], depth + 1);
}

我的代码就是保存所有值,排序,然后再遍历求重复值

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+10;
vector<int> v[maxn];
int n,id, rt, cnt;
double p,r;
vector<int> ans;
bool cmp(int a, int b){
    return a > b;
}
void dfs(int root, int m){
    if(v[root].size()==0){
        ans.push_back(m);
        return;
    }
    for(int i=0;i<v[root].size();i++){
        dfs(v[root][i], m+1);
    }
}

void solve(){
    dfs(rt, 0);
    sort(ans.begin(), ans.end(), cmp);
    for(int i=1;i<ans.size();i++){
        if(ans[i] == ans[0]) cnt++;
    }
    double max_ans = pow(1+r/100, ans[0]) * p;
    printf("%.2f %d\n", max_ans, cnt+1);
}

int main(){
    scanf("%d%lf%lf",&n,&p,&r);
    for(int i=0;i<n;i++){
        scanf("%d",&id);
        if(id != -1)
            v[id].push_back(i);
        else rt = i;
    }
    solve();
}

posted @ 2019-08-01 19:47  Doragd  阅读(123)  评论(0编辑  收藏  举报