您的位置:首页 > 其它

周赛一 1005 搬桌子

2015-11-01 13:34 288 查看
Description

协会为了更好宣传算法魅力,决定包下综合教学楼5楼(吐槽:这么高会有人来吗?)进行讲课。然而综教5楼的每个教室里都有不属于这个教室的桌子,ccc大人的强迫症又发作了,要求我们把桌子还原。机智的庆庆一下子就知道还原这些桌子要花多少时间,但他想考考你们。已知综教5楼的平面图如图,从房间i到房间j要花1min。求花费最小时间?

注意:只要移动路线没有重合,可以同时移动。如:从1号移到6号,从397号移到400号,这两次操作即可同时进行。

room1 room3 room5 …… room397 room399

corridor

room2 room4 room6 …… room398 room400

Input

第一行输入T,表示有T组用例;

每组用例第一行输入N,表示要移动的桌子数量(0< N< 201);

每组用例接下来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

1

2

3

Solution

贪心,用数组room[401]记录每个房间前的走廊被用过多少次,则答案即为max(room[i]);每扫描一个点将数组这个范围内的值加1,注意,范围的确定,若下限为偶数,则下限需减一,若上限为奇数,则上限需加1

Code

#include<stdio.h>
int main()
{
int T,n,l,r;
scanf("%d",&T);
while(T--)
{
int room[401];
for(int i=0;i<401;i++)//初始化
room[i]=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&l,&r);
if(l>r)//如果左端点大于右端点则需将左右端点值互换
{
int t=l;
l=r;
r=l;
}
if(!(l&1)) l--;//左端点是偶数则其需减一,因为搬桌子时也会影响到左端点对面的房间,即第l-1个房间
if(r&1) r++;//右端点是奇数则其需加一,因为搬桌子时也会影响到右端点对面的房间,即第r+1个房间
for(int j=l;j<=r;j++)//区间[l,r]中所有房间的room值均加一表示这次搬运这些房间内都会被影响到
room[j]++;
}
int ans=0;
for(int i=1;i<=400;i++)//找到room[i]的最大值即为答案
if(room[i]>ans)
ans=room[i];
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: