黑心医生
时间限制:
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; }
-
输入包含多组测试数据。