版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37867156/article/details/82947555
链接:https://www.nowcoder.com/acm/contest/200/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
题解:按照出生年月日从大到小排序,暴力查找就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1010;
int v[maxn];
struct node {
char name[11];
int bir;
int age;
}a[maxn];
int b[maxn];
bool cmp(node x, node y){
return x.bir > y.bir;
}
int main()
{
int n, m, k, s;
cin >> n >> m;
for(int i = 0; i < n ; i++){
cin >> a[i].name >> a[i].bir;
int t = a[i].bir, tmp = 0, cnt = 1;
while(t){
tmp += (t%10*cnt);
t /= 10;
cnt *= 10;
if(cnt > 1000) break;
}
a[i].age = tmp;
}
sort(a, a+n, cmp);
while(m--){
cin >> k >> s;
int j = 1;
for(int i = 0; i < n; i++){
if(a[i].age == s)
b[j++] = i;
}
cout << a[b[j-k]].name << endl;
}
return 0;
}