PKU 1456 Supermarket

#include  < iostream >
#define  MAXN 10001
using   namespace  std;

int  JUMP[MAXN];

int  cmp( const   void   * a,  const   void   * b) 
{
    
return  (( int   * )b)[ 0 -  (( int   * )a)[ 0 ];
}

int  find( int  x)      /*  查找包含接点x的集合的根节点  */
{
    
int  i  =  x, t;

    
while  (JUMP[i]  !=  i)
        i 
=  JUMP[i];       /*  最终求出i为树根  */
    
while  (x  !=  i)       /*  压缩路径以提高以后检索效率  */
    {
        t 
=  JUMP[x];
        JUMP[x] 
=  i;
        x 
=  t;
    }
    
return  i;       /*  返回根结点  */
}

int  main()
{
    
int  n, i, ans, day, max;
    
int  p[MAXN][ 2 ];
    
bool  mk[MAXN];
    
    
while  (scanf( " %d " & n)  !=  EOF)
    {
        ans 
=   0 ;
        max 
=   0 ;
        memset(mk, 
0 sizeof (mk));
        
for  (i  =   0 ; i  <  n; i ++ )
        {
            scanf(
" %d %d " & p[i][ 0 ],  & p[i][ 1 ]);
            
if  (p[i][ 1 >  max)
                max 
=  p[i][ 1 ];
        }
        
for  (i  =   1 ; i  <=  max; i ++ )
            JUMP[i] 
=  i;
        qsort(p, n, 
sizeof ( int *   2 , cmp);
        
for  (i  =   0 ; i  <  n; i ++ )
        {
            day 
=  p[i][ 1 ];
            
if  (mk[day])
                day 
=  find(day); 
            
if  (day  >   0 )
            {
                ans 
+=  p[i][ 0 ];
                mk[day] 
=   true ;
                JUMP[day] 
=  day  -   1 ;
            }
        }
        printf(
" %d\n " , ans);
    }
    
return   0 ;
}

转载于:https://www.cnblogs.com/lotus3x/archive/2008/07/05/1236336.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值