题解 | #任务调度#

任务调度

https://www.nowcoder.com/practice/88d5fa34fe0748e09062e48c6ae6ffc7

采用小根堆解题,代码可能有些冗余但思路很清晰:

  1. 数据输入同时用数组保存每个点的入度(代码部分使用了vector解决);
  2. 设计小根堆排序规则:如果入读一样按照字典大小排序,入度不同则按照入读大小排序;
  3. 扫描入读数组,将所有点入队;
  4. 依次输出队头元素;

如有不足,请不吝赐教!

#include <iostream>
#include <queue>
#include <vector>
using namespace std;


struct node{
    int inNum;      // 入度
    int point;      // 点名称
};
bool operator<(node left,node right){   // 小根堆建立规则,入度最小优先,号码最小优先
    if(left.inNum == right.inNum) return left.point > right.point;
    else return left.inNum>right.inNum;
}


int main(){
    int num;string input;
    while(cin>>num){
        vector<int> in(num);                    //入度表
        for(int i=0;i<num;i++){
            cin>>input;
            // 计算入度
            if(input[6]=='N')continue;          // NULL
            long long unsigned int pos = 10;
            while(pos<input.size()){
                int to = input[pos]-'0';
                in[to]++;
                pos+=6;
            }
        }
        // 构建小根堆
        priority_queue<node> qu;
        for(int i=0;i<in.size();i++){
            node newNode;
            newNode.inNum = in[i];
            newNode.point = i;
            qu.push(newNode);
        }
        // 拓扑排序:
        while(!qu.empty()){
            cout<<"Task"<<qu.top().point<<" ";
            qu.pop();
        }

    }
}

全部评论
写的很好,思路很清晰。很好看懂
点赞 回复 分享
发布于 03-14 21:31 贵州
这也不是拓扑排序,只是把入度递减的排序了一遍,这题数据弱才可以通过,超过了10个节点,字符串的划分也不能这么写。
点赞 回复 分享
发布于 03-10 12:35 陕西

相关推荐

不愿透露姓名的神秘牛友
07-01 10:56
点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务