아날로그 큐

교육 1 - H 제목

컴퓨터 과학 학생 '노조의 유일한 프린터는 매우 무거운 작업 부하를 경험하고있다. 때때로이 프린터 대기열에서 백 작업이고, 당신이 시간 출력의 한 페이지를 얻을 때까지 기다려야 할 수도 있습니다. 일부 작업이 다른 사람보다 더 중요하기 때문에, 해커 총장은 발명 및 인쇄 작업 큐에 대한 간단한 우선 순위 시스템을 구현했습니다. 이제, 각각의 작업 (9는 가장 높은 우선 순위 인, 1은 최저로되는) 1 및 9 사이에 우선 순위를 부여하고, 다음과 같은 프린터는 동작한다.
• 큐에있는 Fi를 첫 번째 작업 J는 큐에서 가져옵니다.
작업 J보다 더 높은 우선 순위 큐의 일부 작업이있는 경우 • 다음 인쇄하지 않고 큐의 끝으로 J를 이동합니다.
• 그렇지 않으면, 작업 J 인쇄 (큐에 다시 넣어하지 않음).
이러한 방법으로, 모든 중요한 뮤 FFI N 조리법은 해커 일반 인쇄하는 것은 매우 신속하게 인쇄되는 것을. 물론, 다른 사람이 인쇄하고 있는지 그 성가신 용어 논문은 꽤 많은 시간을 인쇄하려면 기다려야 할 수도 있지만, 생활은입니다. 새 정책에 귀하의 문제는 인쇄 작업이 실제로 완료되는시기를 결정하는 것은 매우 까다로운되었다 때문이다. 이 아웃 gure Fi에 프로그램을 작성하기로 결정. 이 프로그램은 추가 작업이 추가되지 않습니다 가정, (우선 순위 목록으로) 현재의 큐뿐만 아니라 대기열에서 작업의 위치를 ​​받게됩니다, 다음 작업이 인쇄 될 때까지 걸리는 시간을 계산해야한다 큐에. 단순화 문제에, 우리는 인쇄 작업을 항상 정확히 1 분 소요, 추가 및 대기열에서 작업을 제거하는 순간이라고 가정합니다.

입력

양의 정수와 한 줄 : 테스트 케이스의 수 (최대 100). 그런 다음 각 테스트 케이스에 대한 두 개의 정수 n과 m, 여기서 n과 • 한 줄은 대기열에있는 작업의 수 (1 ≤ N ≤ 100)이며, m은 당신의 직업 (0 ≤ m ≤ N-1)의 위치입니다 . 대기열의 처음 인터넷 위치 번호 0, 두 번째 숫자 등등하고있다. • 대기열에있는 작업의 우선 순위를주는 범위 1 ~ 9 n 개의 정수를 한 줄. 정수 처음 Fi를가, 두 번째 작업의 우선 순위 정수 두 번째를 Fi를 첫 번째 작업의 우선 순위를 부여, 등등.

산출

각 테스트 케이스를 들어, 하나의 정수로 한 줄을 인쇄; 작업 때까지 시간 (분)이 완전히 추가 인쇄 작업이 도착하지 않습니다 가정, 인쇄됩니다.

샘플 입력

3 1 0 5 4 2 1 2 3 4 6 0 1 1 1 1 1 9

샘플 출력

1 2 5

#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 5;
const int M = 10;//状压

struct Node
{
	int num;
	int pos;
	Node(int n, int p)
	{
		num = n;
		pos = p;
	}
};
queue<Node> a;
priority_queue<int> x;//max

int main()
{
	int cas;
	scanf("%d", &cas);
	while (cas--)
	{
		int n, m;
		int ans = 0;
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; i++)
		{
			int num;
			scanf("%d", &num);
			a.push(Node(num, i));
			x.push(num);
		}
		Node tmp(0, 0);
		while (a.size() != 0)
		{
			if (a.front().num < x.top())
			{
				tmp = a.front();
				a.pop();
				a.push(tmp);
			}
			else
			{
				ans++;
				if (a.front().pos == m)
					break;
				a.pop();
				x.pop();
			}
		}
		printf("%d\n", ans);
		while (a.size())
			a.pop();
		while (x.size())
			x.pop();
	}
	return 0;
}

사고 :
작업 큐 N-작은 직접 시뮬레이션.

게시 28 개 원래 기사 · 원의 칭찬 0 · 조회수 335

추천

출처blog.csdn.net/xukeke12138/article/details/104627016