【贪心】Moving Tables POJ 1083

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ike940067893/article/details/75163899

题目链接:http://poj.org/problem?id=1083

题目大意:走廊上的房间如下图设置,现在有n个移动桌子的任务,把桌子从xi移动到yi(整个过程中会占用xi到yi房间之间的走廊),每次移动10分钟,可以同时进行但走廊只有一个桌子宽(即不能共用走廊)。问最少多少分钟。

我们可以把移动桌子看成一个区间,有重叠部分的区间是不可以同时进行的。所以问题转换为了求区间重叠的最大个数。因为如图的房间设置,我们可以把奇数看做偶数(1看做2,3看做4,2k+1看做2k+2)。于是我们的数就变为了2、4、6...400。便于计算在除以2,即为1到200的正整数。

在这里求一个点上的覆盖区间个数要用到差分的思想,用一个数组a来计算。对于一个区间[x,y],把a[x]++,a[y+1]--。那么你要统计一个点上区间个数就是它的前缀和。

代码如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

int n,x,y,a[205],t;

int main()
{
	scanf("%d",&t);
	while(t--)
	{
		memset(a,0,sizeof a);
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&x,&y);
			if(x&1)x++;if(y&1)y++;
			x/=2,y/=2;
			if(x>y)x^=y,y^=x,x^=y;
			a[x]++;a[y+1]--;
		}
		int mx=0;
		for(int i=1;i<=200;i++)
			a[i]+=a[i-1],mx=a[i]>mx?a[i]:mx;
		printf("%d\n",mx*10);
	}
}

猜你喜欢

转载自blog.csdn.net/Ike940067893/article/details/75163899
今日推荐