HDU 1050

参考一位大神的代码,代码十分简洁好理解

题意:在一个狭窄的走廊里将桌子从一个房间移动到另一个房间,走廊的宽度只能允许一个桌子通过。给出t,

   表示有t组测试数据。再给出n,表示要移动n个桌子。n下面有n行,每行两个数字,表示将桌子从a房间

   移到b房间。走廊的分布图如一图所示,每移动一个桌子到达目的地房间需要花10分钟,问移动n个桌子

   所需要的时间。

解题思路:若移动多个桌子时,所需要经过的走廊没有重合处,即可以同时移动。若有一段走廊有m个桌子都

     要经过,一次只能经过一个桌子,则需要m*10的时间移动桌子。设一个数组,下标值即为房间号。

     桌子经过房间时,该房间号为下标对应的数组值即加10。最后找到最大的数组值,即为移动完桌子

     需要的最短时间。



#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
int main(){  
    int t,n,count[410],i,start,end,k;  
    scanf("%d",&t);  
    while(t--){  
        scanf("%d",&n);  
        memset(count,0,sizeof(count));  
        while(n--){  
            scanf("%d%d",&start,&end);  
            //可能出发位置比目的地房间大。  
            if(start>end){  
                //无论大小,我们都可以看做从小的房间移动到大的房间  
                k=start;  
                start=end;  
                end=k;  
            }  
            if(start%2==0)//考虑实际情况,出发房间为偶数是减一,可参照题中给出的图一  
               start-=1;  
            if(end%2==1)//目的地房间为奇数时加一  
               end+=1;  
            for(i=start;i<=end;++i)  
               count[i]+=10;  
        }  
        printf("%d\n",*max_element(count,count+400));//STL中寻找数列最大值函数  
    }  
    return 0;  
}  

转载于:https://www.cnblogs.com/dillydally/p/9567787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值