1. 程式人生 > >印表機順序列印問題(一臺印表機有若干個任務,但是印表機每次只能列印一個任務,每個任務是有優先順序的,從1到9)

印表機順序列印問題(一臺印表機有若干個任務,但是印表機每次只能列印一個任務,每個任務是有優先順序的,從1到9)

一臺印表機有若干個任務,但是印表機每次只能列印一個任務,每個任務是有優先順序的,從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;
}