When a young man passes all the tests and is declared a new monk of Shaolin, there will be a fight , as a part of the welcome party. Every monk has an unique id and a unique fighting grade, which are all integers. The new monk must fight with a old monk whose fighting grade is closest to his fighting grade. If there are two old monks satisfying that condition, the new monk will take the one whose fighting grade is less than his.
The master is the first monk in Shaolin, his id is 1,and his fighting grade is 1,000,000,000.He just lost the fighting records. But he still remembers who joined Shaolin earlier, who joined later. Please recover the fighting records for him.
In each test case:
The first line is a integer n (0 <n <=100,000),meaning the number of monks who joined Shaolin after the master did.(The master is not included).Then n lines follow. Each line has two integer k and g, meaning a monk's id and his fighting grade.( 0<= k ,g<=5,000,000)
The monks are listed by ascending order of jointing time.In other words, monks who joined Shaolin earlier come first.
The input ends with n = 0.
3 2 1 3 3 4 2 0
2 1 3 24 2
少林招新,每个进来的人需要和与他武力值最接近的,如果一大一小,选择小的那个,让你输出每组pk双方
map水题,用了一下map重点lower_bound()函数
ac代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <map> using namespace std; int n,m; int main() { int n; while(cin>>n&&n) { map<int,int> mp; mp[1000000000]=1; for(int i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); map<int,int>::iterator it=mp.lower_bound(y); if(it==mp.begin()) cout<<x<<" "<<it->second<<endl; else { map<int,int>::iterator a=it,b=--it; if((a->first)-y<y-(b->first)) cout<<x<<" "<<a->second<<endl; else cout<<x<<" "<<b->second<<endl; } mp[y]=x; } } return 0; }