当前位置: 代码迷 >> 综合 >> HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】
  详细解决方案

HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】

热度:36   发布时间:2023-11-11 11:26:37.0
火影忍者之~静音
 
Time Limit: 1000 MS Memory Limit: 32767 K
Total Submit: 410(92 users) Total Accepted: 113(78 users) Rating: Special Judge: No
Description

传说中的火之国一年一度的公务员选拔又开始了!木叶忍者村此次也要从中选拔出5人来,作为即将上任的新火影纲手的小弟~,可是报考公务员的人数实在是太~~多啦!所以纲手的贴身随从—静音小姐,决定对这写人进行分m批的选拔,每次笔试n人,第一次选出5人,之后每次从这n人与之前参加笔试但未选中的人一起再选出分数最高的5人,如果分数相同则按名字的字典序选择,这样下来可以刷掉一大批人,但纲手只需要5人,这时候就轮到静音小姐的跟班小弟--卡卡西,来将这些人再进行二次筛选,卡卡西决定对这些人进行忍术测试,然后选出前5名,作为最后选出的人选,如果忍术分数相同,那么名字字典序靠前的被选中。

Input
首先是整数mn,表示要进行m波笔试,每波n人,然后是m组,每组n行,每行包括一个字符串与两个整数,表示一个人的名字和他的笔试分数以及他的忍术分数。输入到文件结束,m<=100,n<=100名字不长于20,分数不超过100.
Output
按顺序输出最后选出的5人的名字,每个名字占一行。(第一次选择的时候不需要考虑忍术成绩,第二次选择也不需要考虑笔试成绩)
Sample Input

1 6

abc 10 20

bcd 20 30

cde 30 40

def 40 50

efg 50 60

fgh 60 70

Sample Output

fgh

efg

def

cde

bcd

Source
2012 Spring Contest 3 - STL
Author
拂晓


题意解析一下:

分m批选拔,第一次选拔选拔出五个人.。然后选剩下的人和下一批的人一起,再选出五个。这样重复进行m次。


然后再从选拔出的五个人中再选出五个。



这题如果一直用sort排序的话。会超时。所以这题就要用到优先队列。可以减少排序的次数。减少时间。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct ss
{char name[25];int test;int ninji;friend bool operator < (ss a, ss b)///队列优先顺序{if(a.test==b.test){return strcmp(a.name,b.name)>0;}else{return a.test<b.test;}}};
bool cmp(ss a,ss b)
{if(a.ninji==b.ninji){return strcmp(a.name,b.name)<0;}else{return a.ninji>b.ninji;}
}
int main()
{int n,m;int len;while(~scanf("%d %d ",&m,&n)){len=0;ss temp;ss pep[10005];priority_queue<ss>q;for(int i=0;i<m;i++){for(int j=0;j<n;j++){scanf("%s %d %d",&temp.name,&temp.test,&temp.ninji);q.push(temp);}for(int k=0;k<5;k++)///每次选五个人{pep[len++]=q.top();q.pop();}}sort(pep,pep+len,cmp);for(int i=0;i<5;i++){printf("%s\n",pep[i].name);}}return 0;
}