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