一台打印机有若干个任务,但是打印机每次只能打印一个任务,每个任务是有优先级的,从1到9。打印的时候从序列的第一个开始,如果第一个的
优先级不是最大的,则将其出队,并加入队尾。若其优先级是最大的,则直接打印该任务。设计算法实现如下功能:
输入:
(1)第一行:输入测试案例的个数,第二行:第一个数字是打印任务个数,第二个数据是目标任务在当前任务序列的位置
输出:
(2)目前任务打印完成需要的时间(假设打印一个任务需要1个单位时间,转移、判断任务不需要时间)
(3)所有任务的打印顺序
例如:
1(只有一个测试用例)
2 1(一共两个任务,目标任务的位置是1--任务是从0开始的)
2 3(序列)
输出:
2 1 0
代码:
#include <stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
struct point {
int id;
int pry;
};
int main()
{
int casenum = 0;
int n = 0;
int m = 0;
int j;
int i;
scanf_s("%d", &casenum);
while (casenum--)
{
int pty[115];
point pt[115];
int lst[115];
int lstcnt = 0;
int time = 1;
queue<point>Q;
scanf_s("%d%d", &n, &m);
for (i = 0; i<n; i++)
{
scanf_s("%d", &pty[i]);
pt[i].pry = pty[i];
pt[i].id = i;
Q.push(pt[i]);
}
// 上面是没有问题的
int T = n;
while (T != 0)
{
int count = 0;
point crt = Q.front();
Q.pop();
int ij;
for (ij = 0; ij < n; ++ij)
{
if (crt.pry < pty[ij])
{
count++;
break;
}
}
if (count == 0)
{
lst[lstcnt++] = crt.id;
pty[crt.id] = 0;
T--;
}
else
Q.push(crt);
}
for (j = 0; j < n; j++)
{
printf("%d ", lst[j]);
}
printf("\n");
for (j = 0; j < n; j++)
{
if (lst[j] != m)
{
time++;
}
else
break;
}
printf("%d\n", time);
}
system("pause");
return 0;
}