题意:给你打印任务的数量, 目标打印任务的序号, 目前的打印队列。
如果队头是目前最重要的任务, 则打印, 否则放回队尾。 问, 目标打印任务是第几个打印的。
思路:用队列模拟打印任务队列, 每个元素是带有{int 重要性、bool 是否是目标打印任务}的结构体。然后按照题意去模拟便是。 关键在于如何判断队头任务 是目前最重要的任务。 只要在输入的时候把重要性另存在一个max[]数组里, 然后把这个数组从大到小排序, 每打印一个,下标后移一位。 下标指向的 便是目前最大的。(最后我会说下为什么优先队列不行)
算法复杂度:空
代码:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 105
struct SNode
{
SNode(int pri = 0, bool tar = false) {
priority = pri;
target = tar;
}
int priority;
bool target;
};
int cmp(int, int);
int main()
{
int cases;
scanf("%d", &cases);
while (cases--) {
// init
int jobs[MAX_N];
queue<SNode> que;
int n, target;
memset(jobs, 0, sizeof(jobs));
while (!que.empty()) {
que.pop();
}
// enter
scanf("%d%d", &n, &target);
for (int i = 0; i < n; i++) {
int priority;
scanf("%d", &priority);
if (i == target) {
que.push(SNode(priority, true));
} else {
que.push(SNode(priority, false));
}
jobs[i] = priority;
}
// sort
sort(jobs, jobs + MAX_N, cmp);
// do
bool ok = false;
int count = 0;
int *p = jobs;
while (!ok) {
SNode front = que.front();
que.pop();
if (front.priority == *p) {
count++;
p++;
if (front.target) {
ok = true;
}
}else {
que.push(front);
}
}
//output
printf("%d\n", count);
}
return 0;
}
int cmp(int a, int b)
{
return a > b;
}
那为什么优先队列不行呢? 因为优先队列各个元素之间的相对位置是不变的。
#include <cstdio>
#include <queue>
using namespace std;
struct Jobs
{
Jobs(int pri = 0, bool tar = false) {
priority = pri;
target = tar;
}
friend bool operator < (Jobs a, Jobs b) {
return a.priority < b.priority;
}
int priority;
bool target;
};
int main()
{
int cases;
scanf("%d", &cases);
while (cases--) {
//init
int num, target;
scanf("%d%d", &num, &target);
priority_queue<Jobs> pque;
while (!pque.empty()) {
pque.pop();
}
//enter
for (int i = 0; i < num; i++) {
int priority;
scanf("%d", &priority);
if (i == target) {
pque.push(Jobs(priority, true));
}else {
pque.push(Jobs(priority, false));
}
}
//output
for (int i = 1; i <= num; i++) {
if (pque.top().target) {
printf("%d\n", i);
}
pque.pop();
}
}
return 0;
}
样例3就过不了啦~ 9输出去之后, 都是1. 而目标任务 一开始就排在第一位, 所以优先队列会把这个1top()出来。 当然, 结果是错的啦~