打印机任务排序---JavaScript版


以下为本人思路及代码。本题输入输出均使用牛客网输入输出

题目:

有一个打印机,有一些任务在排着队打印,每个任务都有优先级。
打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来。
输出初始队列的第m个任务的打印时间,每次打印花费单位1的时间。

样例输入:

1 0
4 2
2 3 4
0
1 9 1 1 1

样例输出:

1
2
5


笔者解题思路:

如果输入一行2 3 5 3 4这样一行数据,目标任务为位列第二的“3”,那么按照打印机的思路,它会试图找到最大优先级的5打印出来,在这个过程中,原任务序列中排在“5”前面的“2 3”以不变的顺序,放到了“5”后面的“3 4” 。如此循环,把大于目标“3”的数都以这个方法对数组进行重新重组。但是由于重组数据之后,会找不到原来的目标打印任务所在的位置,所以在一开始还需要对目标任务进行标记,考虑到重组数据的时候,插入字母不会影响别的数组的顺序,笔者在目标任务“3“前面插入字母”p“,这样直到所有的4打印完,p仍然紧跟目标任务。打印5之后任务列表为 3 4 2 p 3,打印4之后变成 2 p 3 3,  这样之后只需要再去找到p的位置,就能知道接下来还需要几次到目标任务了。实现代码如下

var index = parseInt(readline().split(" ")[1]);//目标任务在队列中的位置
var nums = readline().split(" ");//任务队列
var temp = 0;//当前已打印次数
var m = nums[index];//目标任务优先级
var arr;
var line = "";

for(var i in nums){
  if(i == index){
    line += "p";
  }
  line += nums[i];
}
for(var i=9;i>m;i--){
  if(line.indexOf(i) != -1){
    arr = line.split(i);
    temp += arr.length-1;
    line = arr[arr.length-1];
    for(var j=0;j<arr.length-1;j++){
      line += arr[j];
    }
  }
}
var s = line.split("");

for(var i in s){
  if(s[i] == "p"){
    temp++;
    break;
  }
  if(s[i] == m){
    temp++;
  }
}

console.log(temp);


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM