炼心 reheart
炼心 reheart
题目:
题目背景:
Cafeiin神情认真,专心的听着老师讲话。
“既然你已拜入算法门下,我便为你讲讲这算法的修炼之道,
算法之道,分几重境界,初入编程,便是普及,普及之上更有提高。提高之上,一劫一境界。提高
巅峰强者引天雷入体渡劫,便能成就省选,省选再渡劫,便是集训队,集训队再渡劫,便证得IOI大道。
天榜之下还有地榜,从校赛市赛省赛一路渡劫,证得ICPC world final总决赛。
不过,天榜学历皆不过高中,个个都是万里挑一的奇才。
为师便考考你,这天地二榜,谁为首。”
题目描述:
算法之路中有n名同学第i个同学有ai,表示该名同学的程序设计能力,
bi表示该名同学的学历(1表示幼儿园, 2-7表示小学,8-13表示中学,大于13表示更高学历),它的名字是si为字符串
天榜学历不超过13,地榜学历不小于14,满足学历要求的同学会分别在两个榜单中排名.
你需要分别输出,天榜地榜当中,程序设计能力最强的同学中,学历最小的名字,存在多个则输出
字典序最小的那一个,如果榜上无人,输出-1
输入格式:
第一行一个整数n
接下来n行,每行有三个数据,分别是名字字符串si,程序设计能力ai,学历bi
输出格式:
两行,第一行为天榜强者的名字,第二行为地榜强者的名字
样例:
样例输入:
5
cafeiin 18 11
George_Plover 20 12
Karshilov 19 12
wzk 23 14
Lenska 18 12
样例输出:
George_Plover
wzk
数据范围与提示:
对于10% 的数据,天榜强者为George_Plover
对于10%的数据,地榜强者为George_Plove
对于30%的数据,1<=n<=100,ai<=10,bi<=10
对于100%的数据,1<=n<=105,1<=ai<=100,1<=bi<=100,1<=字符串si长度len(si)<=15
保证名字互不相同
解析:
先不得说一下这题目背景,看来我们亲切的出题人也是修炼的同道中人。(有幸遇到道友
抛开题目背景,这道题就是先根据bi分类,为天榜与地榜,再进行排序。
这里我用sort来排序,主要是要写好中间的bool型函数cmp就行了
注意要比较的有三项(ai、bi、si),以及榜中如果没有人就要输出-1
AC代码
//炼心
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
const int MAXN = 100001;
struct kid
{
int a,b;
string name;
};
int n,qnq,quq;
kid tian[MAXN],di[MAXN];
inline bool cmp(kid x,kid y)
{
int l1,l2,i;
if(x.a==y.a)
{
if(x.b==y.b)
return x.name < y.name;
return x.b < y.b;
}
return x.a > y.a;
}
int main()
{
// freopen("reheart.in","r",stdin);
// freopen("reheart.out","w",stdout);
scanf("%d",&n);
int i,a,b;
string m;
for(i=1;i<=n;++i)
{
cin >> m;
scanf("%d%d",&a,&b);
if(b<=13)
{
tian[++qnq].name=m,tian[qnq].a=a,tian[qnq].b=b;
}
else
{
di[++quq].name=m,di[quq].a=a,di[quq].b=b ;
}
}
if(!qnq) printf("-1\n");
else
{
sort(tian+1,tian+1+qnq,cmp);
cout << tian[1].name << endl;
}
if(!quq) printf("-1\n");
else
{
sort(di+1,di+1+quq,cmp);
cout << di[1].name << endl;
}
return 0;
}
完结撒花✿✿ヽ(°▽°)ノ✿