ZOJ1029 Moving Tables

68 篇文章 1 订阅
#include  < iostream >
#include 
< vector >
#include 
< algorithm >  
using   namespace  std;

const   int  TIMEPERMOVE  =   10 ; // 每次分钟
const   int  MAXSIZE  =   200 ;
struct  Move
{
    
int  srcRoom; //
     int  desRoom; // 目标
}moves[MAXSIZE];

bool  lessThan( const  Move &  m1, const  Move &  m2)  
{  
    
return  m1.srcRoom < m2.srcRoom;                    // 按照srcRoom从小到大排序 
}   

int  main( void )
{
    
int  Cases,i,j,k,n,s,t;
    cin
>> Cases;
    
for  (i = 1 ;i <= Cases; ++ i)
    {
        vector
< Move >  moveVect;
        cin
>> n;
        
for  (j = 0 ;j < n; ++ j)
        {
            cin
>> s;
            cin
>> t;
            
if  (s  >  t) 
                swap(s,t);
            moves[j].srcRoom 
=  (s + 1 ) / 2 ;
            moves[j].desRoom 
=  (t + 1 ) / 2 ;
            moveVect.push_back(moves[j]);
        }
        
// 排序
        sort(moveVect.begin(),moveVect.end(),lessThan);
        
int  max  =   0 ;
        
for  (j = 0 ; j < n;  ++ j) 
        {
            
int  count  =   1 , from  =  moveVect[j].srcRoom, to  =  moveVect[j].desRoom;
            
for  (k = 0 ; k < n;  ++ k) 
            {
                
if  (j  ==  k)  continue ;
                
if  (moveVect[k].srcRoom <= to  &&  moveVect[k].desRoom >= from)
                {
                    
if  (from  <  moveVect[k].srcRoom) 
                        from 
=  moveVect[k].srcRoom;
                    
if  (to  >  moveVect[k].desRoom)
                        to 
=  moveVect[k].desRoom;
                    count
++ ;
                }
            }
            
if  (count  >  max)
                max 
=  count;
        }
        cout
<< TIMEPERMOVE * max << endl;
    }
    
return   0 ;
}

还有人给出了不使用贪心的算法,贪心是将每次能同时搬运的桌子都搬运,求总共需要次数。能否同时搬运桌子,取决于搬运使用的走廊是否被占用。因此,实际上我们只需要求出,走廊最多被占用多少次,就可以得出最多要花多少时间,实在是高!

#include  < iostream >
using   namespace  std;

#define  MAXN 201
int  map[MAXN];

void  solve()
{
    
int  i,n,start,end,m;

    
for (i = 0 ;i < MAXN;i ++ ) // 初始化
        map[i]  =   0 ;

    cin 
>>  n;
    
while (n -- )
    {
        cin 
>>  start;
        cin 
>>  end;
        
if (start  >  end)
        {
                
int  temp  =  start;
                start 
=  end;
                end 
=  temp;
        }
        
for (i = (start + 1 ) / 2 ;i <= (end + 1 ) / 2 ;i ++ )
            map[i] 
+=   1 ;
    }

    m 
=  map[ 1 ];
    
for (i = 2 ;i < MAXN;i ++ )
    {
        
if (map[i] > m)
            m 
=  map[i];
    }
    cout 
<<  m * 10   <<  endl;
}

int  main()
{
    
int  t;
    cin 
>>  t;
    
while (t -- )
        solve();
    
return   0 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值