以下為本人思路及代碼。本題輸入輸出均使用牛客網輸入輸出
題目:
有一個打印機,有一些任務在排着隊打印,每個任務都有優先級。
打印時,每次取出隊列第一個任務,如果它的優先級不是當前隊列中最高的,就會被放到隊尾,否則就打印出來。
輸出初始隊列的第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);