求最长路径和最大的消耗代价(阿里巴巴2018年秋招提前批内推编程题)

题目要求如下:
这里写图片描述

示例代码如下:

#include < iostream >
#include < vector>
using namespace std;
int main()
{
    int nSystem;//系统个数
    int nDependency;//依赖关系个数

    //下面的代码完成系统个数和依赖关系个数的输入
    cin >> nSystem;
    cin >> nDependency;

    vector<int> nConsumeTime;//每个系统被调后消耗的时间

    //下面的代码完成nConsumeTime个节点消耗代价的输入
    for (int i = 0; i < nSystem; ++i)
    {
        int temp;
        cin >> temp;
        nConsumeTime.push_back(temp);
    }

    //读取依赖关系
    //用一个二维数组表示系统之间的依赖关系--每一行表示一条链式依赖关系
    //nRelation[0]:第1行的元素依次为:1->2->5,则表示一条链式依赖关系:2依赖1,5依赖2
    //nRelation[1]:第2行的元素依次为:1->3,则表示一条链式依赖关系:3依赖1
    //nRelation[2]:第3行的元素依次为:4->5,则表示一条链式依赖关系:5依赖4

    //下面的代码完成依赖关系的输入
    vector<vector<int>> nRelation;//系统之间的依赖关系
    for (int i = 0; i < nDependency; ++i)
    {
        int nFirst, nSecond;
        cin >> nFirst;
        cin >> nSecond;

        //首先,判断节点(nFirst,nSecond)是否能够链接至已有链路
        //方法:判断二维数组nRelation的每一行的最后一个元素是否和nFirst相等,
        //      如果相等,则属于该链路,直接插入该链条即可。
        //      否则,节点(nFirst,nSecond)属于一条新的链路。
        int j = 0;
        while (j < nRelation.size())
        {
            if (nRelation[j][nRelation[j].size() - 1] == nFirst)
            {//判断是否相等
                //如果相等,则属于该链条
                nRelation[j].push_back(nSecond);
            }
            else
            {
                ++j;//查找下一个链条。判断是否可以插入
            }
        }

        if (j == nRelation.size())
        {//属于一个新的链条
            vector<int> vTemp;
            vTemp.push_back(nFirst);
            vTemp.push_back(nSecond);

            nRelation.push_back(vTemp);
        }
    }

    //计算消耗代价
    vector<int> nSum;
    for (int k = 0; k < nRelation.size(); ++k)
    {
        int sum = 0;

        //计算每一条路径的消耗代价
        for (int m = 0; m < nRelation[k].size(); ++m)
        {//计算第k条路径消耗的代价
            //sum += nRelation[k][m];
            //累加每一条路径,每一个节点的消耗代价,注意:数组的下标是从0开始。
            sum += nConsumeTime[nRelation[k][m] - 1];
        }

        //保存第k条路径的消耗代价
        nSum.push_back(sum);
    }


    //求出最大值消耗代价
    int sumTmp = nSum[0];
    for (int i = 1; i < nSum.size(); ++i)
    {
        if (sumTmp < nSum[i])
        {
            sumTmp = nSum[i];
        }
    }

    //求出最长路径
    int maxRoad;
    if (nRelation.size() > 0)
    {
        maxRoad = nRelation[0].size();

        for (int i = 1; i < nRelation.size(); ++i)
        {
            if (maxRoad < nRelation[i].size())
            {
                maxRoad = nRelation[i].size();
            }
        }
    }
    else if(nRelation.size() == 0)
    {
        maxRoad = 0;
    }

    cout<< maxRoad<< " " << sumTmp << endl;

    return 0;
}

输入题目所给测试用例,执行程序,运行结果如下图所示:
这里写图片描述
注意:上述代码仅供参考,阿里的编程题目,没有提供在线调试功能。你写了代码以后,只能选择保存和提交。
其次,要吐槽一些阿里巴巴的出题毛糙程度。
这里写图片描述
题目的表述都有问题,让别人如何理解。上图前两个表述和后两个表述明显相互矛盾。应该改为:
2 5 //5号系统依赖2号系统
4 5 //5号系统依赖4号系统,
这样才能与前两个表述一致,才能使得输入样例有与题目所述的输出结果。
类似的还有这一道题目:https://blog.csdn.net/Lunar_Queen/article/details/81635437,也是各种表述不当加错别字。

猜你喜欢

转载自blog.csdn.net/Lunar_Queen/article/details/81745412