교육 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-작은 직접 시뮬레이션.