Problem Description
丁爸信奥培训中心最近在富丽科技大厦租了一层楼,这层楼的形状如下:

由图可见,这层楼中间是走廊,两侧各有200个房间,编号如上图。

最近,丁爸信奥培训中心做了内部机构的调整,需要把一些桌子从一个房间搬到另外的房间。因为走廊很窄,但是桌子很大,所以同一段走廊每次只能通过一个桌子。
假设不论远近,每趟搬桌子都需要10分钟。同时,当你从房间i搬桌子到房间j的过程中,房间i到房间j之间的走廊都被占用,也就是说,在每个10分钟内,不能有多个任务共享同一段走廊。

现在,丁爸想知道:要完成所有的搬运任务,最少需要多少时间?

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

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

Sample input
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
Sample output
10
20
30

贪心

可以将每个连续过程断开,如1-4可视为1-2,3-4同时进行,时间都是搬一次;

所以可以将整个过程分成若干小块取重复数最多的一块即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a[220];
void solve()
{
    int n;
    cin>>n;
    int s,t;
    memset(a,0,sizeof a);
    for(int i=0;i<n;++i) 
    {
    	cin>>s>>t;
    	s=(s+1)/2;t=(t+1)/2;
    	if(s>t) swap(s,t);//注意这一步,搬桌子可以从大往小也可以从小往大
    	for(int j=s;j<=t;++j) a[j]++;
    }
    cout<<*max_element(a+1,a+201)*10<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        solve();
    }
    return 0;
}

 posted on 2022-12-11 11:31  ruoye123456  阅读(243)  评论(0编辑  收藏  举报