Moving Tables

7 篇文章 0 订阅

题目描述
著名的ACM公司租用了一幢楼的一层,其形状如下。
在这里插入图片描述
整个楼层在走廊的北面和南面各有300个房间。最近公司制定了一个改变布局的方案,包括在不同房间之间移动许多桌子。由于走廊狭窄,而且桌子都很大,只有一张桌子可以穿过走廊。为了提高工作效率,经理制定了如下方案:把一张桌子从一个房间搬到另一个房间可以在5分钟内完成。当移动一张桌子从I房间搬到J房间时,房间I前面和房间J前面的走廊部分被使用了。因此,在每5分钟,在不共用走廊的情况下,不同的移动方案可以同时进行。为了说明问题,经理举例说明了可能发生的情况和不可能同时发生的情况。
在这里插入图片描述

对于每个房间,最多一张桌子要么搬进去,要么搬出去。现在,经理要计算移动给定的桌子所需的最短时间。你的工作是写一个程序来解决经理的问题。

输入
输入包括T组测试用例,测试用例的数量M在输入的第一行中给出。每组测试用例的第一行是一个整数N(1<=N<=200),N表示要移动桌子的数量,紧接着是N行,每行包括2个正整数S和T,分别代表一张桌子从S房间移动到T房间(一个房间的序号,在一组测试用例中最多出现一次)。从第N+3行开始,列出了剩余的测试用例,格式和第一个测试用例相同。
输出
输出移动N个桌子所需要的最短时间,每个测试用例结果占一行。
样例输入
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50

样例输出
5
10
15

#include<iostream>
using namespace std;

int Compare(int *r,int m)
{
	int k;
	int n=1;
	for(k=0;k<2*m-2;k=k+2) 
	{
		if(r[k+1]>r[k]&&r[k+3]>r[k+2])
		{
			if(r[k+1]>=r[k+2])
			n++;
		}
		else if(r[k+1]>r[k]&&r[k+3]<r[k+2])
		{
			if(r[k+1]>=r[k+3])
			n++;
		}
		else if(r[k+1]<r[k]&&r[k+3]>r[k+2])
		{
			if(r[k]>=r[k+2])
			n++;
		}
		else if(r[k+1]<r[k]&&r[k+3]<r[k+2])
		{
			if(r[k]>=r[k+3])
			n++;
		}
		
	}
	return n*5;
}

int main(void)
{
	int *r;
	int m,n,i,j,s,x;
	cin>>m;
	for(j=0;j<m;j++)
	{
		cin>>n;
		r=new int[600];
		for(i=0;i<n*2;i++)
		{
			cin>>r[i];
		}
		for(i=0;i<n*2;i++)
		{
			s=r[i];
			for(x=i+1;x<n*2-i;x++)
			{
				if(s==r[x])
				n=0;
			}
		}
		n=Compare(r,n);
		cout<<n<<endl;
		delete r;
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值