描述
为了迎接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;
}