题目:题目链接
题意:每个和尚有个ID和战斗值,刚开始只有一个老和尚,id为1,战斗值为1000000000 ; 有n个新和尚,他可以与战斗值最接近的老和尚战斗,战斗完,新和尚变老和尚.输出每个新和尚和老和尚战斗的id:
分析:就是二分查找距离战斗力相差最近的那个,先使用set来做,如下:
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
int n;
int g, id;
set<int> st;
map<int, int> mp;
while(scanf("%d", &n))
{
if(!n)
break;
st.clear();
mp.clear();
st.insert(1000000000);
mp[1000000000] = 1;
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &id, &g);
printf("%d ", id);
set<int>::iterator it = st.lower_bound(g);
if(it == st.end())
{
it--;
printf("%d\n", mp[(*it)]);
}
else
{
int tmp = (*it);
if(it != st.begin())
{
it--;
if(g - (*it) <= tmp-g)
printf("%d\n", mp[(*it)]);
else
printf("%d\n", mp[tmp]);
}
else
printf("%d\n", mp[*it]);
}
mp[g] = id;
st.insert(g);
}
}
return 0;
}
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
int n;
int id, hp;
map<int, int> mp;
while(scanf("%d", &n))
{
if(!n)
break;
mp.clear();
mp[1000000000] = 1;
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &id, &hp);
printf("%d ", id);
map<int, int>::iterator it = mp.lower_bound(hp);
if(it == mp.end())
{
it--;
printf("%d\n", it->second);
}
else
{
int t1 = it->first;
int tmp = it->second;
if(it != mp.begin())
{
it--;
if(hp - it->first <= t1 - hp)
printf("%d\n", it->second);
else
printf("%d\n", tmp);
}
else
printf("%d\n", it->second);
}
mp[hp] = id;
}
}
return 0;
}