火影忍者之~静音
传说中的火之国一年一度的公务员选拔又开始了!木叶忍者村此次也要从中选拔出5人来,作为即将上任的新火影纲手的小弟~,可是报考公务员的人数实在是太~~多啦!所以纲手的贴身随从—静音小姐,决定对这写人进行分m批的选拔,每次笔试n人,第一次选出5人,之后每次从这n人与之前参加笔试但未选中的人一起再选出分数最高的5人,如果分数相同则按名字的字典序选择,这样下来可以刷掉一大批人,但纲手只需要5人,这时候就轮到静音小姐的跟班小弟--卡卡西,来将这些人再进行二次筛选,卡卡西决定对这些人进行忍术测试,然后选出前5名,作为最后选出的人选,如果忍术分数相同,那么名字字典序靠前的被选中。
1 6
abc 10 20
bcd 20 30
cde 30 40
def 40 50
efg 50 60
fgh 60 70
fgh
efg
def
cde
bcd
——————————————————————————————————————————————————————————————
优先队列维护,把每轮参加的人压进队列,每轮弹出前5个,存进数组在排序。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <set>
#include <map>
using namespace std; struct node
{
char name[25];
int bi,zhan;
bool friend operator<(node a,node b)
{ if(a.bi!=b.bi)
return a.bi<b.bi;
return strcmp(a.name,b.name)>0;
}
} p,fl[10005]; bool cmp(node a,node b)
{
if(a.zhan!=b.zhan)
return a.zhan>b.zhan;
return strcmp(a.name,b.name)<0;
} priority_queue<node>q; int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
while(!q.empty())
q.pop(); int cnt=0;
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
scanf("%s%d%d",p.name,&p.bi,&p.zhan);
q.push(p);
}
int x=0;
while(x<5)
{
x++;
fl[cnt++]=q.top();
q.pop();
}
}
sort(fl,fl+cnt,cmp);
for(int i=0; i<5; i++)
{
printf("%s\n",fl[i].name);
} } return 0;
}