题目描述
ADD N P:往队列里加入id为N的优先级为P的任务NEXT:输出下一个最高优先级的任务的id,如果优先级相同输出id小的任务,若队列中没有任务输出-1
REMOVE N:移除id为N的任务
COUNT:输出队列中的任务数量
思路
用结构体数组充当优先级队列,记录队首和队尾的位置。ADD()先将输入的结构体加入数组中,即挂在队尾。再按优先级大小排序,优先级大的放在队头,若优先级相等,按ID大小排序,ID小得结构体靠近队头。
NEXT()输入队头结构体的ID。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100010;
int L = 0, R = 0;
struct node{
int id;
int rank;
}Node[maxn];
bool cmp(node a, node b){
if(a.rank != b.rank) return a.rank > b.rank;
else return a.id < b.id;
}
int index = 0;
void ADD(int N, int P){
Node[index].id = N;
Node[index].rank = P;
index++;
R = index;
sort(Node + L, Node + R, cmp);
}
void COUNT(){
printf("%d\n", R - L );
}
void NEXT(){
if(L == R){
printf("-1\n");
}else{
printf("%d",Node[L].id);
}
}
void REMOVE(int N){
if(Node[L].id == N){
L++;
}else if(Node[R-1].id == N){
R--;
}else{
int flag;
for(int i = L; i < R; i++){
if(Node[i].id == N){
flag = i;
break;
}
}
for(int i = flag - 1; i >= L; i--){
Node[i + 1].id = Node[i].id;
Node[i + 1].rank = Node[i].rank;
}
L++;
}
}
int main(){
char str[10];
while(scanf("%s", str) != EOF){
if(strcmp(str, "ADD") == 0){
int N, P;
scanf("%d %d", &N, &P);
ADD(N, P);
for(int i = L; i < R; i++){
printf("%d %d", Node[i].id, Node[i].rank);
if(i < index - 1) printf(" ");
}
printf("\n");
}else if(strcmp(str, "COUNT") == 0){
COUNT();
}else if(strcmp(str, "NEXT") == 0){
NEXT();
}else if(strcmp(str, "REMOVE") == 0){
int N;
scanf("%d", &N);
REMOVE(N);
for(int i = L; i < R; i++){
printf("%d %d", Node[i].id, Node[i].rank);
if(i < index - 1) printf(" ");
}
printf("\n");
}
}
return 0;
}