加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:48:04 所属栏目:百科 来源:网络整理
导读:题目描述 链接 给一棵树,在树根处货物的价格为p,然后每往下走一层,价格增加r%,求所有叶子结点的最高价格,以及这个价格的叶子结点个数 分析 关键在于dfs怎么设计来保存这个最大值,以及最大值的个数 别人的代码如下,比较巧。。。还用了个maxnum。。我怎

题目描述

链接
给一棵树,在树根处货物的价格为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 %dn",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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读