牛客练习赛28
A.生日宴
题目描述
Akoasm有一群朋友,但是由于Akoasm是人赢朋友太多,当他想知道某一天谁生日时,总是很头疼。于是,他请你来帮忙。
Akoasm会给出他所有朋友的名字与出生年月日,名字为10个字符以内的英文字母,出生年月日为8位数字如19990320。每一个询问包含月份与日期和一个整数k,输出生日在这天的年龄第k大的人。题目保证每一个朋友的出生年月日不同,且出生年月日均在19000101至19991231,保证一定有答案。
询问中生日为四位,如0320,1211。
输入描述:
输入文件第一行包含1个正整数n,m,表示一共有n个朋友,一共有m次询问。
接下来n行,每行一个字符串加八位数字,中间用一个空格隔开,分别表示名字和出生年月日。
接下来m行,每行2个正整数k与s,表示求出生日在s的年龄第k大的人。
输出描述:
一共m行,每行一个字符串表示答案
示例1
输入
3 2 Lee 19380220 Jane 19400220 Mary 19990321 2 0220 1 0321
输出
Jane Mary
备注:
对于100%的数据有n<=1000,m<=20。
解题思路:先将年份升序排,再对月份日期升序排,然后暴力查找匹配的月份日期即可。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 int n,m,k,pos;string str,tmp,s; 5 struct node{ 6 string s1,s2,obj; 7 }arr[1005]; 8 bool cmp(node a,node b){ 9 if(a.s2!=b.s2)return a.s2<b.s2; 10 else return a.s1<b.s1; 11 } 12 int main(){ 13 while(cin>>n>>m){ 14 for(int i=0;i<n;++i){ 15 cin>>str>>tmp; 16 arr[i].s1=tmp.substr(0,4);//从起始位置0截取4个字符 17 arr[i].s2=tmp.substr(4,4); 18 //cout<<arr[i].s1<<' '<<arr[i].s2<<endl; 19 arr[i].obj=str; 20 } 21 sort(arr,arr+n,cmp); 22 while(m--){ 23 cin>>k>>s;pos=0; 24 for(int i=0;i<n;++i){ 25 if(arr[i].s2==s)pos++; 26 if(pos==k){cout<<arr[i].obj<<endl;break;} 27 } 28 } 29 } 30 return 0; 31 }