Highest Price in Supply Chain(运行超时的问题)

运行超时的原因是:
当该树是一条链表的时候,当末端有很多叶子节点的时候,通过叶子找父亲,就需要找好多次

解决方法:
(1)开辟一个数组,用于存放该节点到根节点(包括叶子节点和根节点的个数),当该数组的值有意义的时候,直接拿来用。采用递归的方式来对该数组进行更新。
(2)采用根节点到叶子节点的dfs

两种方法的代码如下:

//第一种方法
#include<bits/stdc++.h>
using namespace std;
int pare[100000] = {-1};
bool vis[100000] = {false};
int countnum[100000] = {-1};
int n;
double m ,r;
int Find(int i){
    if(i == -1)
        return 0;
    else{
        int tem;
        if(countnum[i]!=-1){
            return countnum[i];
        }else{
            tem = Find(pare[i]);
            tem++;
            countnum[i] = tem;
            return tem;
        }
    }        
}
int main(){
    fill(countnum,countnum+100000,-1);
    cin>>n>>m>>r;
    for(int i = 0 ; i < n ; i++){
        int p;
        cin>>p;
        vis[p] = true;
        pare[i] = p;
    }
    double max = 0.0;
    int index = 0;
    for(int i = 0 ; i < n ; i++){
        if(!vis[i]){
            int count = 0;
            count = Find(i);
            double temtotal = m*pow((1+r/100),count-1);
            if(temtotal>max){
                max = temtotal;
                index = 1;
            }else if(temtotal == max){
                index++;
            }
        }
    }
    printf("%0.2lf %d",max,index);
}
//第二种方法
#include<bits/stdc++.h>
using namespace std;
int n;
double p,r;
vector<int> tree[100000];
double maxprice = 0.0;
int num = 0;

void DFS(int root,int deep){
    if(tree[root].empty()){
        double temprice = p*pow((1+r/100),deep-1);
        if(temprice > maxprice){
            maxprice = temprice;
            num = 1;
        }else if(temprice == maxprice){
            num++;
        }
    }
    
    for(int i = 0 ; i < tree[root].size() ; i++){
        DFS(tree[root][i],deep+1);
    }
}

int main(){
    int target;
    cin>>n>>p>>r;
    for(int i = 0 ; i < n ; i++){
        int m;
        cin>>m;
        if(m != -1)
            tree[m].push_back(i);
        else
            target = i;
    }
    
    DFS(target , 1);
    printf("%0.2f %d",maxprice,num);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值