HDOJ 1050 :Moving tables

题目大意

著名的ACM(高级计算机制造商)公司租用了一栋建筑的地板,其形状如下。楼沿走廊的北侧和南侧各有200间客房。最近,公司制定了一项改革计划。改革包括在房间之间移动很多桌子。因为走廊很窄,所有的桌子都很大,只有一张桌子能穿过走廊。需要一些计划来提高移动效率。经理想出了以下计划:将桌子从房间移到另一个房间可以在 10 分钟内完成。将桌子从 I 房间移到 j 房间时,使用 I 房间前面和 j 房间前面之间的走廊部分。因此,每10分钟,在两个房间之间移动几个不共享走廊的同一部分将同时进行。为了清楚说明,经理说明了可能的情况和不可能同时移动的情况。对于房间,最多只能搬入或搬出一张桌子。现在,经理会寻找一种方法,以最大限度地减少移动所有表的时间。你的工作是编写一个程序来解决经理的问题。

解题思路:将搬运路线画成一条线,找出重叠度最高的,再乘以搬运时间;

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a,b;
	while(n--)
	{
		int max=0;
		int arr[200]={0};
		int m;
		cin>>m;
		for(int i=0;i<m;i++)
		{
			cin>>a>>b;
			a=(a-1)/2;
			b=(b-1)/2;
			if(a>b)
			swap(a,b);
				for(int j=a;j<=b;j++)
				arr[j]++;
		}
		for(int i=0;i<200;i++)
		if(arr[i]>max)
		max=arr[i];
		cout<<max*10<<endl;
	}
	return 0;
}

遇到的问题:忘记了搬运的桌子可以从房间序号大的搬运到序号小的,如果是从房间序号大的搬运到序号小的,应该对调一下;没注意房间是对立的,所以再确认路线时忘记了除以2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值