冷血格斗场

描述

为了迎接2022年的杭州亚运会,让大家更加了解各种格斗运动,Little Gyro新开了一家冷血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。

我们假设格斗的实力可以用一个正整数表示,成为实力值,两人的实力值可以相同。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有多个人的实力值与他差别相同,则他会选择id最小的那个。

不幸的是,Little Gyro一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮Little Gyro恢复比赛纪录,按照时间顺序依次输出每场比赛双方的id。

输入

本题有多组测试数据,对于每组数据,第一行中包括一个数N (0 < N <=105),表示格斗场新来的会员数(不包括Little Gyro)。以后N行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,Little Gyro就算是会员,id为1,实力值恒等于109。

输出

对于每组数据,输出N行,每行两个数,为每场比赛双方的id,新手的id写在前面。

样例输入
3
2 3
3 1
4 2
样例输出
2 1
3 2
4 2

思路

有相同实力值,要注意比较id值,如果输入的id值更小,要重新更新

code

#include<iostream>
#include<map>
using namespace std;
int main(){
    int n,strength,id;
    while (cin >> n) {
        map<int, int> club;//第一个键值为实力值,第二个为id值 
        club.insert(make_pair(1000000000,1));
        while (n--) {
            scanf("%d%d",&id,&strength);
            if(club.find(strength)!=club.end()){//有相同值 
                auto it = club.find(strength);
                if(id < it -> second){//新的id值更小 
                    printf("%d %d\n",id,it->second);
                    club[strength] = id;
                }else
                    printf("%d %d\n",id,it->second);//新的id值更大,则输出比赛结果
            }

            else{//没有相同值 
                auto it1 = club.upper_bound(strength);
//找到第一个大于给定键值的元素迭代器 
                if (it1 == club.begin()) {
                    printf("%d %d\n",id,it1->second);
                }
                else if (it1 == club.end()) {
                    printf("%d %d\n",id,it1->second);
                }
                else {//返回迭代器在club中间时,比较前后2个迭代器(实力值) 
                    auto it2 = it1--;
                    int gap1 = abs(it1->first - strength);
                    int gap2 = abs(it2->first - strength);
                    if (gap1 == gap2) 
                        printf("%d %d\n",id,min(it2->second , it1->second) );

                    else if (gap1 < gap2) 
                        printf("%d %d\n",id,it1->second);

                    else 
                        printf("%d %d\n",id,it2->second);
                }
                club[strength] = id;
            }
        }
        club.clear();
    }
    return 0;
}
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值