第十三周作业:冷血格斗场

本文介绍了一个算法问题,该问题旨在通过使用C++中的map和set来恢复一系列格斗比赛中参赛者的配对记录。输入包括新会员的数量及他们的ID和实力值,输出则是每场比赛中选手的ID对。算法考虑了当存在多个实力相近的对手时,选择ID最小的对手进行比赛的情况。
总时间限制: 
1000ms 
内存限制: 
65536kB
描述

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

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

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

输入

第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,facer就算是会员,id为1,实力值1000000000。

输出

N行,每行两个数,为每场比赛双方的id,新手的id写在前面。

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

4 2

/*
 * 主要map,set玩的还不是很熟吧- - 自己还是给写出来(又掌握了2个以前不会的知识,感觉好激动。。)
*/
#include "iostream"
#include "map"
#include "cmath"
#include "algorithm"
using namespace std;
typedef map<int, int> MP;
int main() {
	int n;
	MP mp;
	cin >> n;
	mp[1000000000] = 1;
	while (n--) {
		int id, val;
		cin >> id >> val;
		pair<MP::iterator,bool> p = mp.insert(make_pair(val, id));
		if (p.second == false) { /*插入失败*/
			cout << id << " " << mp[val] << endl;
			if (id < mp[val]) {
				mp[val] = id; /*保证val相等情况下 id最小*/
			}
		}
		else { /*插入成功 比较前后*/
			MP::iterator  p1;
			p1 = mp.find(val);
			MP::iterator p2, p3;
			if (p1 == mp.begin()) {
				p2 = ++p1;
				cout << id << " " << p2->second << endl;
			}
			else if (p1 == mp.end()) {
				p2 = ++p1;
				cout << id << " " << p2->second << endl;
			}
			else {
				p2 = --p1;
				p1++;
				p3 = ++p1;
				p1--;
				if (abs(p2->first - p1->first) < abs(p3->first - p1->first)) {
					cout << id << " " << p2->second << endl;
				}
				else if (abs(p2->first - p1->first) > abs(p3->first - p1->first)) {
					cout << id << " " << p3->second << endl;
				}
				else {
					int minId = min(p2->second, p3->second);
					cout << id << " " << minId << endl;
				}
			}
		}
	}
	return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值