6Luffy6

导航

冷血格斗场

描述

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

posted on 2024-05-04 15:01  不AC不睡觉  阅读(2)  评论(0编辑  收藏  举报