【2015】优先队列的实现(没有思路。。)

27 篇文章 2 订阅
6 篇文章 0 订阅

题目描述
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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值