POJ 1727 Advanced Causal Measurements (ACM)

题目看了半天都没看懂,后来参考了该博客http://maybeiloveu.iteye.com/blog/523396才有了思路。

题目的主要思路是采用排序和二分查找,找到一个符合条件的t的最大值。

代码如下:

#include<stdio.h>

typedef struct event
{
	int x;
	int t;
} event;

event e[100000];

int cmp(const void *a, const void *b)
{
	event *e1, *e2;
	e1 = (event *)a;
	e2 = (event *)b;
	if(e1->x != e2->x)
	   return e1->x - e2->x;
	else return e1->t - e2->t;
}

int check(int t, int n, int m)
{
	int last_b,last_e,begin,end,count,i;
	last_b = e[0].x - (e[0].t-t);
	last_e = e[0].x + (e[0].t-t);
	count=1;
	for(i=1; i<n; i++)
	{
		begin= e[i].x - (e[i].t-t);
		end= e[i].x + (e[i].t-t);
		if(last_e < begin)
		{
			count++;
			if(count > m) return 0;
			last_b = begin;
			last_e = end;
		}
		else 
		{
			if(last_b <= begin) last_b = begin;
			if(end <= last_e) last_e = end;
	    }
	}
	return 1;
}

int main()
{
	int cases, n, m, i, j;
	int t_max, t_min, mid, ans;
	scanf("%d", &cases);
	for(i=0; i<cases; i++)
	{
		scanf("%d%d", &n, &m);
		t_max=1000000;
		t_min=-2000000;
		for(j=0; j<n; j++)
		{
			scanf("%d%d", &e[j].t, &e[j].x);
			if(e[j].t < t_max) t_max=e[j].t;
		}
	
		qsort(e, n, sizeof(event), cmp);
		
		while(t_min <= t_max)
		{
			mid=(t_min + t_max) >> 1;
			if(check(mid, n, m))
			{
				ans = mid;
				//继续往上找 
				t_min=mid+1;
			}
			else t_max=mid-1;
		}
		
		printf("Case %d: %d\n", i+1, ans);
	}
	
	return 0;	
}


你可能感兴趣的:(POJ 1727 Advanced Causal Measurements (ACM))