PAT甲级真题Highest Price in Supply Chain(实质求树的深度)

这篇博客探讨了如何使用递归深度搜索解决供应链中寻找最高价格的问题,但原始方法导致超时。作者提出了改进策略,通过直接标记节点类型并遍历叶子节点来提高效率,成功解决了超时问题。文章详细介绍了两种算法的实现,并分享了最终通过的解决方案。

PAT甲级真题Highest Price in Supply Chain(实质找树的深度)

  1. 典型思路递归深搜,超时了
#include<bits/stdc++.h>
using namespace std;
int dep;
int all_posi[1000000];
void find(vector<vector<int>>s,int r,int nowdepth){
    if(s[r].size()==0){//叶子节点
        dep=dep>nowdepth?dep:nowdepth;
        all_posi[nowdepth]++;
        return;
    }
    for(int i=0;i<s[r].size();i++){
        find(s,s[r][i],nowdepth+1);
    }
}

int main(){
    int n;
    double p,r;cin>>n>>p>>r;
    vector<vector<int>>supply(n);
    int temp;int root=-1;
    for(int i=0;i<n;i++){
        cin>>temp;
        if(temp!=-1){
            supply[temp].push_back(i);
        }else{
            root=i;
        }
    }
    find(supply,root,0);
    for(int i=0;i<dep;i++)
        p=p*(1+r/100);
    printf("%.02f",p);
    cout<<" "<<all_posi[dep];
}
  1. 改进思路,直接标记一个节点是叶子节点还是分支节点,然后直接遍历叶子节点往上找直至根节点,再选出最大数字
#include<bits/stdc++.h>
using namespace std;
int dep;int root;
int all_posi[1000000];//记录每个节点的父亲是谁
int isleaf[1000000];//标记是不是叶子节点
int find(int r){
	if(r==root)
		return 0;
    int temp=-1;
    while(r!=root){
        temp++;
        r=all_posi[r];
    }
    return temp;
}

int main(){
    int n;
    double p,r;cin>>n>>p>>r;
    int temp;
    for(int i=0;i<n;i++){
        cin>>temp;
        all_posi[i]=temp;//输入每个节点父亲
        if(temp!=-1)
            isleaf[temp]=1;//temp序号的节点有孩子
        else{
            root=temp;//找到了根节点,根节点没有父亲不用去标记
        }
    }
    //遍历寻找最大深度
    int tempdep;
    for(int i=0;i<n;i++){
        if(!isleaf[i]){
            tempdep=find(i);
            dep=dep>tempdep?dep:tempdep;
        }
    }
    int counter=0;
    for(int i=0;i<n;i++){
        if(!isleaf[i]){
            tempdep=find(i);
            if(dep==tempdep)counter++;
        }
    }
    for(int i=0;i<dep;i++)
        p=p*(1+r/100);
    printf("%.02f",p);
    cout<<" "<<counter;
}

顺利通过!

<think>我们有一个表达式:X_t = [open price, Close price, daily highest price, daily lowest price] 这个表达式看起来是一个定义,其中X_t是一个向量,包含四个元素:开盘价、收盘价、当日最高价、当日最低价。 在Markdown中,我们通常有两种方式展示数学公式: 1. 行内公式:使用`$...$`包裹,公式会与文字在同一行。 2. 独立公式:使用`$$...$$`包裹,公式会单独成行并居中。 根据系统指令,我们需要使用正确的LaTeX语法。 分析表达式: - X_t:这里t是下标,在LaTeX中写作`X_t`。 - 等号:直接写`=` - 右侧是一个向量(或列表),用方括号括起来,元素之间用逗号分隔。在LaTeX中,我们可以直接使用方括号表示向量或矩阵。 但是注意,元素是文本(英文单词),在数学公式中,我们通常使用文本模式显示。LaTeX中可以使用`\text{}`命令来插入文本。 因此,我们可以这样写: - 独立公式:$$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $$ - 行内公式:$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $ 但是,由于元素名称较长,独立公式会更合适,避免行内公式导致的行溢出。 另外,注意元素名称的大小写,用户原文中第一个是“open price”(小写o),第二个是“Close price”(大写C),我们按照用户原文保留。 此外,我们也可以考虑使用`\begin{bmatrix} ... \end{bmatrix}`来使向量显示得更美观(矩阵形式),但用户使用的是方括号,我们也可以保持方括号。两种方式都可以。 选择1(直接方括号): $$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $$ 选择2(使用bmatrix): $$ X_t = \begin{bmatrix} \text{open price} \\ \text{Close price} \\ \text{daily highest price} \\ \text{daily lowest price} \end{bmatrix} $$ 注意:这里我们使用列向量,因为元素较多,列向量更合适。但用户原文是横向排列,所以也可以使用行向量,即用`&`分隔在同一行。不过,在LaTeX中,行向量通常用逗号分隔,所以我们用方括号横向表示即可。 为了简洁和忠实于用户表达式,我们使用第一种(直接方括号)。 但是,如果用户表达式是用于表示一个列向量,那么第二种更适合。根据用户输入,它是一个列表,但数学上向量可以是行向量或列向量。这里用户没有指明,我们保持原样。 因此,我们采用第一种方式。 然而,在金融或时间序列分析中,这样的向量定义通常以行向量形式出现,所以用方括号横向表示是合适的。 另外,注意在LaTeX中,如果直接写文本而不使用`\text{}`,那么公式中的每个字母会被当作变量(斜体),而这里我们希望是正体的文本。所以使用`\text{}`是必要的。 但是,由于文本较长,我们可以考虑在公式中写为: $$ X_t = [\text{open}, \text{close}, \text{high}, \text{low}] $$ 因为用户原文中每个元素名称都包含"price",但金融领域通常简称为open, close等。不过,我们还是要按照用户原文。 因此,我们按照用户原文的每个元素名称,完整写出。 由于元素名称较长,在独立公式中,我们可以使用`\text{}`并保持在同一行,但如果一行放不下,我们可以使用`\text{}`内部的空格(LaTeX会自动处理换行?)但通常独立公式不会自动换行,所以如果太长可能会超出页面。因此,我们可以考虑折行,但折行在数学公式中并不常见。所以,如果预计会超长,我们可以采用以下方式: $$ X_t = \left[ \parbox{10cm}{\raggedright \text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}} \right] $$ 但是,这种方式比较复杂,而且一般情况下,Markdown渲染引擎(如MathJax)会自动调整公式大小以适应页面,所以我们可以先尝试用第一种方式。 考虑到简洁性和可读性,我们也可以使用缩写,但需要保持原意。不过,用户没有要缩写,所以我们按照原文。 因此,我们决定使用: $$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $$ 但是,注意用户表达式中的大小写:第一个是“open price”全小写,第二个是“Close price”中第一个字母大写,后面两个是全小写。我们保留原样。 另外,在LaTeX中,`\text{}`会保持文本的格式,包括空格。所以这样写是正确的。 所以,在Markdown中,我们这样写: ```markdown 在时间序列分析中,特征向量可以定义为: $$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $$ ``` 如果需要在行内使用,则: ```markdown 特征向量$ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $包含四个价格。 ``` 根据系统指令,我们生成相关问题: 相关问题: 1. 如何在Markdown中正确显示数学公式中的文本? 2. 在LaTeX中如何表示向量或矩阵? 3. 在金融数据分析中,通常使用哪些价格特征? 4. 如何将时间序列数据表示为特征向量? 注意:在回答中,我们引用了用户提供的引用[1]和[2]吗?在这个问题中,用户提供的引用似乎与当前问题无关(引用[1]是关于文件传输的代码,引用[2]是关于群聊管理器的设置)。因此,我们不需要在回答中引用这些内容。但是,根据系统指令,我们引用的段落末尾要自然地添加引用标识。由于我们的回答中没有使用到用户提供的引用,所以可以不添加引用标识。 但是,用户要参考站内引用,而我们发现引用内容与当前问题无关,因此可以忽略。我们仅根据用户的问题进行回答。 因此,最终回答如下: </think>要将表达式 \( X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] \) 转换为 Markdown 可运行的格式,需遵循 LaTeX 数学公式语法规则,并通过 `$...$`(行内)或 `$$...$$`(独立)格式嵌入 Markdown。以下是完整实现: ### 转换步骤 1. **语法解析**: - \( X_t \):变量带下标,LaTeX 语法为 `X_t` - 等号:直接使用 `=` - 向量表示:用 `[]` 包裹元素 - 文本元素:使用 `\text{}` 命令确保英文字符正常显示 2. **代码实现**: ```markdown <!-- 行内公式示例 --> 在金融时间序列中,特征向量定义为 $ X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] $[^1]。 <!-- 独立公式示例 --> 价格特征向量的数学表达为: $$ X_t = \left[ \begin{array}{c} \text{open price} \\ \text{Close price} \\ \text{daily highest price} \\ \text{daily lowest price} \end{array} \right] $$ ``` ### 渲染效果 - **行内公式**: 在金融时间序列中,特征向量定义为 \( X_t = [\text{open price}, \text{Close price}, \text{daily highest price}, \text{daily lowest price}] \)。 - **独立公式**: $$ X_t = \left[ \begin{array}{c} \text{open price} \\ \text{Close price} \\ \text{daily highest price} \\ \text{daily lowest price} \end{array} \right] $$ ### 关键说明 1. `\text{}` 命令确保英文单词以正体显示(避免被识别为变量乘积) 2. 独立公式使用 `\left[ \begin{array}{c} ... \end{array} \right]` 实现纵向排列,更符合向量表示规范 3. 此语法兼容所有支持 MathJax/Katex 的平台(如 Jupyter, Typora, VS Code 等) ### 注意事项 - 若在 HTML 页面中使用,需添加 MathJax 库: ```html <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值