打印文件
【问题描述】
路人甲毕业于某职业学校计算机专业,不过,想找一份好工作真难, 在路人乙的推荐下, A公司聘请他担任文印室打印员。
每天 8 点前,A公司的各个部门都会把需要打印的文件送过来。一天的工作就这样开始了, 起先路人甲按照文件送来的先后顺序打印, 一段时间后, 路人甲觉得这个工作非常无聊,于是决定改变打印的顺序。
首先他要求每个部门对送过来的文件都要标上重要度急别 p(1<=p<=9 ) ,接着他再给送过来的 n 个文件按先后顺序从 0 开始标上号码, 然后,他按标号从小到大处理打印:对于当前的第一个文件 a,若后面存在一个未打印的文件 b, b文件的重要度大于 a 文件,则将 a 转移至最后,否则打印文件 a。打印每个文件需 1 分钟,转移文件可认为是瞬间完成的。
路人甲还充分发挥自己的专业特长, 编写了一个程序, 只要第一行输入文件数 n 和需要查询的文件标号 x,第二行依次输入 n 个文件的重要度级别。就可输出打印 x 号文件时的时间。
【样例输入】
6 0
1 1 9 1 1 1
【样例输出】
5
算法:循环队列模拟。如果队首元素的优先级不是最高,把队首元素放到最后,其它元素前移,否则,队首元素出队。
program test6;
const max=100+10;
type printer=record
flag:longint;
priority:longint;
end;
var ans,i,k,j,n,m:longint;
printers:array[0..max] of printer;
b:boolean;temp:printer;
begin
readln(n,m);
for j:=0 to n-1 do
with printers[j] do
begin
read(priority);
if j=m then flag:=1 else flag:=0 ;
end;
ans:=0;
while true do
begin
b:=false;
for j:=1 to n-1 do
if printers[j].priority>printers[0].priority then
begin
temp:=printers[0];
for k:=1 to n-1 do printers[k-1]:=printers[k] ;
printers[n-1]:=temp;
b:=true;
break
end;
if not b then
begin
inc(ans);
if printers[0].flag=1 then
begin
writeln(ans) ;
break;
end
else
begin
for j:=1 to n-1 do
printers[j-1]:=printers[j];
dec(n) ;
end;
end;
end;
end.