HOJ 1318 -- Moving Tables

HOJ 1318 -- Moving Tables
一道模拟题,koala's idea 给出一些线段求重叠最大的部分重叠了几次
两个注意的地方:
1. 输入s、t,s可能大于t。
2. 如果小的数为偶数,小的数要减1,大的数如为奇数,大的数要加1,详情见图。
这是模拟的代码
 1  #include  < stdio.h >
 2  #include  < string .h >
 3   
 4  int  main()
 5  {
 6       int  s,t,f[ 450 ],testcases,n;
 7       int  i,j;
 8      
 9      scanf( " %d " , & testcases);
10       while (testcases -- )
11      {
12          scanf( " %d " , & n);
13          memset(f, 0 , sizeof (f));
14           for (i  =   0 ; i  <  n; i ++ )
15          {
16              scanf( " %d%d " , & s, & t);
17               if (s  >  t) s ^= t ^= s ^= t;
18               if ( ! (s & 1 )) s -- ;
19               if (t & 1 ) t ++ ;
20               for (j  =  s; j  <=  t; j ++ )
21                  f[j] ++ ;
22          }
23           int  count  =   0 ;
24           for (i  =   0 ; i  <   400 ; i ++ )
25               if (f[i]  >  count) count  =  f[i];
26          printf( " %d\n " ,count  *   10 );
27      }    
28       return   0 ;
29  }

练一下离散化及map
#include  < stdio.h >
#include 
< string .h >
#include 
< map >
 
using   namespace  std;
 
int  main()
{
    
int  testcases,n,num[ 250 ][ 2 ],end,room[ 1000 ];
    
int  i,j;
    map
< int , int >  huhupao,h;
    map
< int , int >  ::iterator index;
    scanf(
" %d " , & testcases);
    
while (testcases -- )
    {
        scanf(
" %d " , & n);
       
        
for (i  =   0 ; i  <  n; i ++ )
        {
            scanf(
" %d%d " , & num[i][ 0 ], & num[i][ 1 ]);
            
int  temp;
            
if (num[i][ 0 >  num[i][ 1 ])
            {
                temp 
=  num[i][ 0 ];
                num[i][
0 =  num[i][ 1 ];
                num[i][
1 =  temp;
            }
                
            
if (num[i][ 0 &   1   ==   0 ) num[i][ 0 ] -- ;
            
if (num[i][ 1 &   1 ) num[i][ 1 ] ++ ;
            
/* *********************这段是离散化************************************ */
            huhupao[num[i][
0 ]] ++ ; // 存入map在map中自动排序
            huhupao[num[i][ 1 ]] ++ ;
        }
        end 
=   0 ;
        
for (index  =  huhupao.begin();index  !=  huhupao.end(); index ++ ) // 在另一个map里将排好序的的数重新编号,原来的num现在对应h[num]
            h[index -> first]  =  end ++ ;
        
/* ************************************************************** */     
        memset(room,
0 , sizeof (room));
        
int  m  =   0 ;
        
        
for (i  =   0 ; i  <  n; i ++ )
            
for (j  =  h[num[i][ 0 ]]; j  <=  h[num[i][ 1 ]]; j ++ )
                room[j]
++ ;
                
        
for (i  =   0 ; i  <=  end; i ++ )
            
if (m  <  room[i]) m  =  room[i];
            
        printf(
" %d\n " ,m  *   10 );
        huhupao.clear();
        h.clear();
    }
    
return   0 ;
}

你可能感兴趣的:(HOJ 1318 -- Moving Tables)