一.题目
题目链接:Uva12100
二.思路
很明显使用队列来当作容器存储。用一个结构体来做数据结构存储每一个job的id和优先级。用一个数组来保存每种优先级工作的数量。在判断是否要添加到队尾的时候,只要在该数组中,比它优先级高的任意一个元素值不为0,就说明该任务的优先级不是最高,添加到队尾。详情请看代码注释。
三.源代码
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
struct Job {
int id;
int priority;
}; //用一个结构体保存每个job的信息
int priorities[10]; //保存每个优先级类别有多少个job,用来判断是否有比某个共工作的优先级更高的工作比较方便
bool isTopPriority(int pri) {
for (int i = pri + 1; i < 10; i++)
//如果某个比它更高的优先级工作数不为0,说明它不是当前最高优先级
if (priorities[i] != 0)
return false;
return true;
}
int main() {
queue<Job> jobs;
int n_case, n, m, cost = 0, pri_temp;
bool flag = false;
Job j_temp;
fill(priorities, priorities + 10, 0);//优先级数组初始化全为0
cin >> n_case;
while (n_case--) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> pri_temp;
j_temp.id = i;
j_temp.priority = pri_temp;
jobs.push(j_temp);
priorities[pri_temp]++;//相应的保存的优先级工作数组的数值也要更新
}
while (true) {
j_temp = jobs.front();
jobs.pop();
flag = isTopPriority(j_temp.priority);
if (flag) {
cost++;
priorities[j_temp.priority]--;//打印一个job的时候,记得要把包含该job优先级的数组更新
if (j_temp.id == m) {
cout << cost << endl;
break;
}
} else
jobs.push(j_temp);
}
//当前循环结束后,要记得把相关的值重置,不要影响下一次循环
cost=0;
fill(priorities, priorities + 10, 0);
queue<Job> empty;
swap(empty, jobs);
}
return 0;
}