hey各位粉丝大大们,大家好哇!
今天,给大家分享一道题目(含答案)
C++的热血格斗场听过吧?
今天就来做个plus!
老样子,上题目:
热血格斗场 - 2
内存限制 :65536kB 总时间限制:1000Ms
描述:为迎接08年的奥运会,让大家更加了解各种
格斗运动,facer新开了一家热血格斗场.格斗场 实行会员制,但是新来的会员不用交入会,而只要同一名老会员打一场表演赛,证明自己的实力.
假设格斗的实力可以用一个正整数表示,称为实力值,两人的实力值可以相同,另外,每一个人都 有一个唯一的ID,也是一个正整数.为了使得比赛更好看每一个新会员都会选择一个与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有多个人与他差别相同,则他会选择id最小的一个. 不幸的是,Facer一不小心 把比赛记录弄丢了,但他还是保留着会注册记录.现在请你回复比赛记录,按照时间顺序依次输出每场比赛双方的id
输入:第一行一个数n(0 < n <100000),表示格斗场新来的会员数(不包括Facer).
以后n行每一行两个数,按照入会的时间给出会员的id和实力值
.一开始,Facer就算是会员,id为1,实力值1000000000.
输出:N行,每行两个数,为每场比赛双方的id,新手的id写在前面 注意:与热血格斗场差异:输入不保证两个人实力值不同
了解了与上题的差异后,就可以开始做了
代码如下:
#include <algorithm> //算法的英文
#include <iostream> //C++标准输入输出流
#include <sstream> //stringstream,string输入输出流
#include <map> //C++STL中的一个容器
using namespace std;
int main()
{
map<int,int> mp;//map <实力值,会员id> mp;
map<int,int>::iterator it; //老会员迭代器
int n,t,id,id2,p;//id新会员,id2老会员,p实力值
stringstream out;//保存结果
cin>>n;
mp[1000000000] = 1;
for(int i=1;i<=n;i++)
{
cin>>id>>p;
it=mp.lower_bound(p);
if(it==mp.end())
{
it--;
}
t=abs(it->first-p);
id2=it->second;
if(it!=mp.begin())
{
it--;
if(abs(it->first-p)<t || (abs(it->first-p)==t && it->second<id2))
{
id2=it->second;
}
}
out<<id<<" "<<id2<<endl;
mp[p]=id;
}
cout<<endl<<out.str();
return 0;
}
艾特我的粉丝们:这是只有你们才能阅读的文章哦~