【10.22 牛客普及(三)】 牛半仙的妹子gcd 題解

ssl_yty發表於2020-10-25

【10.22 牛客普及(三)】 牛半仙的妹子gcd 題解

題目

牛半仙有 n n n 個妹子。
牛半仙用對於每個妹子都有一個名字,並且給了每個妹子一個評分。
牛半仙的審美與名字有關,他想知道名字以某字母結尾的妹子中,評分第 k k k 大的妹子的名字。
如果出現評分相同的妹子,牛半仙會認為先讀入的妹子評分更大。

由於牛半仙是隻死鴿子,於是他找到了你,請你幫幫他。


輸入

第一行兩個正整數 n n n, m m m
接下來 n n n 行,每行一個妹子名,保證由小寫字母組成,長度不超過 50 50 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。(不需要輸出引號)


樣例

input
5 2
aaa 1
aa 2
a 3
ab 3
bb 4
b 2
a 4

output
ab
Orz YYR tql


資料範圍

對於5%的資料: n n n≤10, m m m≤1000
對於 20% 的資料: n n n, m m m≤1000
對於所有資料 n n n, m m m≤105 ,保證名字長度小於等於 50
對於所有資料 n n n, m m m≤105 , k k k n n n,保證名字長度小於等於50


解題思路

將同一字母結尾的名字放進一個陣列
按評分排序
然後輸入m行
從排完序後的陣列直接取名字輸出


程式碼

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct hhx{
    int sl,h[100010];
}a[30];
char c;
string x[100010],sc="";
int f[100010],n,m,y,k,s;
bool cmp(int x,int y)
{
     return (f[x]>f[y]||(f[x]==f[y]&&x<y));
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        getchar();
        c=getchar();
        while (c!=' ')
        {
              x[i]+=c;
              c=getchar();
        }
        scanf("%d",&f[i]);
        y=x[i].size();
        a[x[i][y-1]-96].sl++;
        a[x[i][y-1]-96].h[a[x[i][y-1]-96].sl]=i;
    }  
    for (int i=1;i<=26;i++)
        sort(a[i].h+1,a[i].h+a[i].sl+1,cmp);  //將同一字母結尾的評分排序
    for (int i=1;i<=m;i++)
    {
        getchar();
        c=getchar();
        scanf("%d",&k);
        y=c-96;
        if (a[y].sl<k)  //如果不存在
           printf("Orz YYR tql\n");
           else {
               sc=x[a[y].h[k]];
               printf("%s\n",sc.c_str());  //存在,則輸出妹子的名字
           }
    }
    return 0;
}

相關文章