NYOJ 754 黑心医生(优先队列)

本文介绍了NYOJ算法竞赛中第754题——黑心医生的解题思路,重点探讨如何利用优先队列优化算法,提高问题解决效率。
摘要由CSDN通过智能技术生成

黑心医生

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

南阳有一家灰常势利的医院,这家医院有一个灰常势利的门诊医生,由于他的医术比较高明,所以每天都有很多人来看他的门诊。但是,他很势利,所以他看病有一个规矩,那就是优先给有钱的人看病。他事先了解了挂他的号的病人的家庭经济情况,所以,当轮到某病人就诊时,如果剩下的病人里有比他更富有的病人,那么他就必须得站到看病队伍的最后面重新等待;如果没有,那么黑心医生就会立即给他看病,而且保证能看好他的病(难怪他的生意这么好哦!)。

现在我想知道当某病人看完病后黑心医生一共看好了几名病人,是不是很简单!Just do it!

输入
输入包含多组测试数据。
每组数据占两行:
第一行:两个整数n和m(n<1000),分别表示来看病的总人数和要询问的病人挂的号(病人挂的号从0开始,从左到右依次累加)。
第二行:n个整数,分别对应病人的经济情况(n个整数均能用32位整数表示)。
输出
输出单独占一行,输出当病号为m的病人看完病后,黑心医生一共看好了几名病人。
样例输入
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
样例输出
1
2
5


思路很简单,用队列储存病人,用优先队列储存病人的财富,然后一个一个出队,如果没找到,出队重新入队
ac代码:
 
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define MAXN 1010
using namespace std;
struct s
{
	int a;//财富 
	int num;//编号 
}d[MAXN],c;
queue<s>s;
priority_queue<int>ss;
int main()
{
	int n,k;
	int i,j;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(i=0;i<n;i++)
		{
		   scanf("%d",&d[i].a);
		   d[i].num=i;
		   s.push(d[i]);
		   ss.push(d[i].a);
	    }
		int sum=0;
		int bz=0;
		while(bz==0)
		{
			c=s.front();
			if(c.a==ss.top())//找到最大值 
			{
				if(c.num==k)//找到目标
				{
			     	bz=1;
			     	sum++;
			    }
				else
				{
			      s.pop();
				  sum++;
			    }
			    ss.pop();
			}
			else
			{
				s.pop();
				s.push(c);
			}
		}
		while(!s.empty())
		{
			s.pop();
		}
		while(!ss.empty())
		{
			ss.pop();
		}
		printf("%d\n",sum);
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值