http://acm.hdu.edu.cn/showproblem.php?pid=4585
少林寺初始有一个人,每来一个人都得和已有的与他武力值最相近的打,输出谁和谁打
看了题解,学了一点stl
map:map按key从小到大自动排序
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int N,id,val;
map<int,int>ma;
while(~scanf("%d",&N)&&N)
{
ma.clear();
ma[1000000000]=1;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&id,&val);
ma[val]=id;
map<int,int>::iterator it=ma.find(val);
if(it==ma.begin())printf("%d %d\n",id,(++it)->second);
else if(it==ma.end())printf("%d %d\n",id,(--it)->second);
else
{
map<int,int>::iterator it1=it,it2=it;
it1--, it2++;
if(abs(it1->first-val)>abs(it2->first-val))printf("%d %d\n",id,it2->second);
else printf("%d %d\n",id,it1->second);
}
}
}
return 0;
}
set:set里有个lower_bound函数
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int N,id,val;
set<int>se;
map<int,int>ma;
while(~scanf("%d",&N)&&N)
{
se.clear();
ma.clear();
se.insert(1000000000);
ma[1000000000]=1;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&id,&val);
set<int>::iterator it=se.lower_bound(val);
if(it==se.begin())printf("%d %d\n",id,ma[*it]);
else
{
set<int>::iterator it1=it,it2=it;
it1--;
if(abs(*it1-val)<=abs(*it2-val))printf("%d %d\n",id,ma[*it1]);
else printf("%d %d\n",id,ma[*it2]);
}
se.insert(val);
ma[val]=id;
}
}
return 0;
}