来源 :牛客网
题目描述
牛半仙有
n
n
n妹子。
牛半仙用对于每个妹子都有一个名字,并且给了每个妹子一个评分。
牛半仙的审美与名字有关,他想知道名字以某字母结尾的妹子中,评分第
k
k
k大的妹子的名字。
如果出现评分相同的妹子,牛半仙会认为先读入的妹子评分更大。
由于牛半仙是只死鸽子,于是他找到了你,请你帮帮他。
输入描述:
第一行两个正整数
n
,
m
n,m
n,m 。
接下来
n
n
n行,每行一个妹子名,保证由小写字母组成,长度不超过 50,然后一个整数,表示这个妹子的评分。
接下来
m
m
m 行,每行一个字母
x
x
x ,表示询问名字以某个字母结尾的妹子,然后一个正整数
k
k
k ,表示询问排名为
k
k
k的妹子。
输出描述:
m
m
m 行,每个询问输出一行,表示妹子的名字。
如果名字以
x
x
x结尾的妹子中不存在排名为
k
k
k的妹子,输出 Orz YYR tql
。(不需要输出引号)
示例1
输入
5 2
aaa 1
aa 2
a 3
ab 3
bb 4
b 2
a 4
输出
ab
Orz YYR tql
备注:
对于
5
%
5\%
5%的数据 :
n
≤
10
,
m
≤
1000
n\leq 10,m\leq 1000
n≤10,m≤1000
对于
20
%
20\%
20%的数据:
n
,
m
≤
1000
n,m\leq 1000
n,m≤1000
对于所有数据
n
,
m
≤
1
0
5
,
k
≤
n
n,m\leq 10^5,k\leq n
n,m≤105,k≤n,保证名字长度小于等于 50
解题思路
1、考试的时候想太多,然后打了一堆,不过还是过了(耶)
2、先用map存下名字、评分、下标,然后快排
3、统计每个名字的尾字母出现次数(有多少个)
4、找名字
Code
#include <algorithm>
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
struct DT{
string s;
int k, i;
}a[100100];
int n, m, name, key, num[30], z, check;
char s;
bool cmp(const DT&k, const DT&l){//快排
if (k.s[k.s.size() - 1] == l.s[l.s.size() - 1])
{
if (k.k == l.k)
return k.i < l.i;
else return k.k > l.k;
}else return k.s[k.s.size() - 1] < l.s[l.s.size() - 1];
}
int main(){
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
cin >> a[i].s;//名字
scanf ("%d", &a[i].k);//评分
a[i].i = i;//
}
sort (a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
num[a[i].s[a[i].s.size() - 1] - 'a' + 1]++;//记录出现次数(有多少个)
for (int i = 1; i <= m; i++)
{
cin>>s;
scanf ("%d", &z);
int j = 1, c = 'a';
while (c != s)//找到字母所在位置
{
j += num[c - 'a' + 1];
c++;
}
check = j + num[c - 'a' + 1], j += z - 1;//找到排名为k(z)的妹子
if (j < check)//没有超过下一个字母的位置(有排名第k的妹子)
{
cout<<a[j].s<<endl;
continue;
}
printf ("Orz YYR tql\n");
}
}