hdu4858 (2013杭州邀请赛)

点击打开链接


题意:

少林寺进去一些人,每个人都有对应的id和fight,每个人进去都找跟他fight最近,并且比他早入门的人比武,求每个人比武的对象。。

注意进去人的id是随机的,而且可能有多个人的fight相同。。。。


二分找fight相等的,然后找对应的id。。


#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
#define N 100005
struct node
{
	int id,fight;
	int tt;
}A[N];

int n;
int B[N];
int T[N];

bool cmp(node a,node b)
{
	if(a.fight!=b.fight)return a.fight<b.fight;
	return a.id<b.id;
}

int fun(int t)
{
	int x=B[t];
	int l,m,h;
	l=1;
	h=n+1;
	while(l<=h)
	{
		m=(l+h)/2;
		if(A[m].fight<x)l=m+1;
		else if(A[m].fight>x)h=m-1;
		else break;
	}
	int i;
	for(i=m;i<=n+1;i++)
		if(A[i].id==t)return i;
	for(i=m;i>0;i--)
		if(A[i].id==t)return i;
	return -1;
}

int main()
{
	int i,j;
	
	while(scanf("%d",&n)!=-1&&n)
	{
		A[1].id=1;
		A[1].fight=100000000;
		for(i=2;i<=n+1;i++)
		{
			scanf("%d%d",&T[i],&A[i].fight);
			A[i].id=i;
			A[i].tt=T[i];
			B[i]=A[i].fight;
		}
		sort(A+1,A+n+2,cmp);
		/*
		for(i=1;i<=n+1;i++)
			printf("%d %d\n",A[i].id,A[i].fight);
		*/
		int ans;
		printf("%d 1\n",T[2]);
		for(i=3;i<=n+1;i++)
		{
			int t=fun(i);
			int min=1000000111;
			for(j=t-1;j>0;j--)
			{
				if(A[j].id<A[t].id&&(A[t].fight-A[j].fight<=min))
				{
					min=A[t].fight-A[j].fight;
					ans=j;
				}
				if(A[t].fight-A[j].fight>min)break;
			}
			for(j=t+1;j<=n+1;j++)
			{
				if(A[j].id<A[t].id)
				{
					if(A[j].fight-A[t].fight<min)
						ans=j;
					break;
				}

			}
			printf("%d %d\n",T[i],A[ans].tt);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值