以下为本人思路及代码。本题输入输出均使用牛客网输入输出
题目:
有一个打印机,有一些任务在排着队打印,每个任务都有优先级。
打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来。
输出初始队列的第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);