POJ 1083 Moving Tables

原创 2012年03月29日 15:35:25

题目:

      著名的ACM公司租了一层楼,楼层的布局如下:



       该楼层共有400个房间,每边200个房间。最近,公司想进行一些调整,其中包括在房间之间移动很多桌子。因为楼道很窄,桌子很大,只有一张桌子能通过楼道,所以有必要指定一个计划来使桌子移动更加高效。将桌子从一个房间移动到另外一个房间可以在10分钟内完成,当桌子从房间i移动到房间j时,从房间i到房间j部分的楼道被占用(闭区间)。在10分钟内,移动多张桌子如果不共享楼道的话,可以同时进行。下面列举了一些同时移动桌子可能的情况和不可能的情况:


对于每一个房间,至多有一张桌子移出或移进,如何找到一种方法使得移动桌子的时间最短?


输入:

输入包含T个测试用例,第一行输入测试用例的个数T,接下来依次输入每个测试用例的数据。每个测试用例的第一行输入需要移动的桌子数N,1<=N<=200,接下来的N行输入两个整数s和t,表示桌子从房间s移动到房间t。每个房间在N行输入中至多出现一次。


输出:

输出每个测试用例移动完所有桌子需要的最少时间。


样例输入:

3

4

10  20

30  40

50  60

70  80

2

1  3

2  200

3

10  100

20  80

30  50


样例输出:

10

20

30


解题思路:

1 将表示区间的数字统一转换成奇数,如[2,4]变为[1,3]

2 如果区间开始数字比结束数字大,则反转区间,如[3,1]反转为[1,3]

3 将区间变为前闭后开区间,如[1,3]变为[1,5)

4 将表示区间的数字统一排序,区间开始数字类型为“S”,区间结束数字类型为“T”,排序时如果数字相同,则类型为“T"的排在前面。

5 设定统计变量count=0。顺序扫描排序后的数组,遇到类型为"S"的数字count++,遇到类型为"T"的数字count--,记录count达到的最大值max。

count的最大值max即为两两互斥区间的最大数目,所以最后输出的结果为max*10。


代码:

#include<stdio.h>

struct Node
{
	int num;
	char type;
};

int partition(struct Node *list, int start, int end)
{
	struct Node pivot,temp;
	int i,j;
	pivot = list[start];
	i=start;
	j=i+1;
	while(j<=end)
	{
		if(list[j].num < pivot.num || (list[j].num==pivot.num && list[j].type=='T'))
		{
			i++;
			temp = list[j];
			list[j] =  list[i];
			list[i] = temp;
		}
		j++;
	}
	temp = list[i];
	list[i] = pivot;
	list[start]=temp;
	
	return i;
}

void quikSort(struct Node *list, int start, int end)
{
	int index;
	if(start>=end) return;
	index = partition(list, start, end);	
	quikSort(list, start, index-1);
	quikSort(list, index+1, end);
}

int main()
{
	int cases,n,i,j,s,t,len,count,max,temp;
	struct Node list[400];
	
	scanf("%d", &cases); //输入测试用例数目
	
	for(i=0; i<cases; i++)
	{
		scanf("%d", &n);
		for(j=0; j<n; j++) 
		{
			scanf("%d %d", &s, &t);
			//统一转换成奇数 
			if(s%2==0) s--;
			if(t%2==0) t--;
			if(s>t){temp=s; s=t; t=temp;}
			//转换成前闭后开区间
			t+=2;
			//保存 
			list[j*2].num=s;
			list[j*2].type='S';
			list[j*2+1].num=t;
			list[j*2+1].type='T';			 			
		}
		
		//排序
		len = 2*n;
		quikSort(list, 0, len-1);
	
		//计算两两互斥区间的最大数目
		max=count=0;
		for(j=0; j<len; j++)
		{
		   if(list[j].type=='S')
		   {
			 count++;
			 if(count > max) max=count;
		   }
		   else count--;
		}
		printf("%d\n", max*10);
	}
	
	return 0;
}






E-Moving Tables|贪心

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 读完题目,头有点大...线段覆盖问题,分情况讨论,然后求出结果。说实话,我内心是拒绝的。这么写...
  • Rollchuchy
  • Rollchuchy
  • 2016年04月19日 00:10
  • 176

Moving Tables (贪心)

Moving Tables Problem Description The famous ACM (Advanced Computer Maker) Company has rented a fl...
  • LVJINYANJY
  • LVJINYANJY
  • 2018年02月03日 20:39
  • 6

hdu1050 Moving Tables

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1050 求区间上点的最大重叠次数。 #include #include int main() ...
  • yew1eb
  • yew1eb
  • 2013年08月04日 15:51
  • 1621

Poj_1083 Moving Tables(贪心,测试数据)

题意: 房间之间通过单通道抬桌子,一共有400个房间,分别按照图上顺序编号。每次交换需要10分钟,当两个交换路径不重叠时可以在同一个时间间隔内完成。给出所有的搬动需求,问最少需要的时间。 思路: 最开...
  • EaShion1994
  • EaShion1994
  • 2016年12月12日 21:20
  • 333

Moving Tables

 http://acm.hdu.edu.cn/showproblem.php?pid=1050 #include #include using namespace std; int ma...
  • shuangyueliao
  • shuangyueliao
  • 2015年03月18日 15:00
  • 251

POJ 1083 - Moving Tables

Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose...
  • Sureina
  • Sureina
  • 2016年08月22日 16:39
  • 136

POJ - 1083 Moving Tables

//poj 1083 // [6/11/2014 wind] #include #include #include #include using namespace std; const i...
  • u011044487
  • u011044487
  • 2014年06月11日 20:10
  • 445

POJ 1083 Moving Tables

The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in ...
  • XDU_PYL
  • XDU_PYL
  • 2015年06月19日 16:14
  • 459

POJ 1083 —— Moving Tables

Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a building who...
  • pan_00_hao
  • pan_00_hao
  • 2013年02月01日 14:30
  • 265

POJ 1083 Moving Tables

转载请注明出处:http://blog.csdn.net/a1dark 分析:本来以为是一道DP。。。结果发现是贪心、再看看原来是区间覆盖问题、看覆盖次数最多的区间 #include #inclu...
  • verticallimit
  • verticallimit
  • 2013年12月04日 14:57
  • 707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1083 Moving Tables
举报原因:
原因补充:

(最多只允许输入30个字)