zoukankan      html  css  js  c++  java
  • 牛客网练习赛28A

    题目链接:https://www.nowcoder.com/acm/contest/200/A

    链接:https://www.nowcoder.com/acm/contest/200/A
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    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

    题意很简单,这里就不多解释了
    思路:因为询问是一个月份,求的是在这个月份的第K大的人:
    因为求的是相同月份第k大的人, 首先我们要求得在这个月份里的所有人,这就可以用set 来存储了,分别存储月份和出生年月,首先找到第一个该月份的人,然后它的后面k个就是我们要的答案了
    刚开始以为可以用multimap来做,后来查阅资料才发现multimap对键值相同的数排序是根据插入顺序排的,但是我们需要的是按照大小来排序,所以是不行的
    看代码:
    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9;
    const int maxn=1000+50;
    const int maxm=1;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        int n,m,k;
        string a,b,c;
        map<string,string>s;//一对一的关系,用map很合适
        set<pair<string,string> >s1;//用于存储月份和出生年月,因为set会从小到大自动排序,先比较first,再比较second
        set<pair<string,string> >::iterator it;
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            cin>>a>>b;//输入名字和出生年月
            c=b.substr(4,4);//获取月份
            s[b]=a;//将出生年月为这一天的人和名字用map对应起来,一对一的关系
            s1.insert(make_pair(c,b));//把出生年月和月存在s1中
        }
        for(int i=0;i<m;i++)
        {
            cin>>k>>a;
            it=s1.begin();
            for(it;it!=s1.end();it++)
            {
                if(it->first==a)//遍历找到月份为a的人
                {
                    for(int j=1;j<k;j++)//找到第K个
                        it++;
                    cout<<s[it->second]<<endl;//直接输出就可以了
                    break;
                }
            }
    
        }
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9782323.html
Copyright © 2011-2022 走看看