周赛一 1005 搬桌子

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 
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;iscanf("%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;
}

你可能感兴趣的:(周赛一 1005 搬桌子)