其他分享
首页 > 其他分享> > I. 搬桌子

I. 搬桌子

作者:互联网

题目描述

某人在某栋大厦租了一层楼, 这层楼形状如下:
在这里插入图片描述
由图可见, 这层楼中间是走廊, 两侧各有200个房间, 编号如上图.
最近, 因某些原因, 需要把一些桌子从一个房间搬到另外的房间. 因为走廊很窄, 但是桌子很大, 所以同一段走廊每次只能通过一个桌子.
假设不论远近, 每趟搬桌子都需要10分钟. 同时, 当你从房间i搬桌子到房间j的过程中, 房间i到房间j之间的走廊都被占用, 也就是说,在每个10分钟内, 不能有多个任务共享同一段走廊.
现在, 请求要完成所有的搬运任务, 最少需要多少时间?

输入

输入包含T组测试用例. 在第一行给出测试例个数(T).
每组测试用例首先是一个正整数N, 表示需要搬运的桌子数量.
接下来N行, 每行包含2个正整数s和t, 表示需要将一个桌子从房间s搬到房间t.

输出

计算并输出完成所有的搬运任务需要的最少的时间,每组数据占一行.

数据范围

1<=N<=200

样例输入

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

思路分析

  由题意可知, 对于需要共用走廊的房间段, 每次只能通过一张桌子, 所以我们只需统计每个房间 (其实这里改成每段走廊更为合适, 但走廊是和房间一 一对应的, 所以应该也没有问题) 被共用的次数, 然后进行排序, 其最大值就是不能同时搬运桌子的次数, 之后再乘以10, 就是本题答案.
  其实本题也是使用贪心算法解决的, 因为它尽可能使搬运办公桌同时进行, 以便使单独安排的搬运次数最少, 自然的这样用的时间最少. 所以, 所用最少时间为不能同时搬运桌子的次数,即房间被共用次数的最大值.

样例代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int t;
	cin>>t;
	int *p=new int [t];
	int room[200]={0}; //用于统计每个房间被共用的次数
	for(int i=0;i<t;i++)
	{
		int n;
		cin>>n;
		for(int j=0;j<n;j++)
		{
			int left,right;
			cin>>left>>right;  //输入需要搬桌子的两个房间
			//因为只有一条走廊, 所以要对输入的数据进行处理, 例如:1,2->0.
			left=(left-1)/2
			right=(right-1)/2;
			if(left>right) //这是一个需要注意的地方, 因为输入的数据可能第一个比较大, 然而第二个比较小, 不符合我们程序的含义
			{
				int temp=right;
				right=left;
				left=temp;
			}
			for(int k=left;k<=right;k++)  //进行统计
				room[k]++;
		}
		sort(room,room+200); //排序
		p[i]=room[199];
		for(int j=0;j<200;j++)
			room[j]=0;
	}
	for(int i=0;i<t;i++)
		cout<<p[i]*10<<endl;
}

标签:10,right,int,房间,桌子,left
来源: https://blog.csdn.net/m0_62121252/article/details/122766732