ZOJ1029

贪心,考虑连廊的特殊性即可过了

 

#include <iostream>
#include 
<cstdlib>
using namespace std;

const int MAX_SIZE = 202
;

typedef 
struct

{
    
int
 s,t;
    
bool mark;//标记是否已移动

}
Node;

Node table[MAX_SIZE];
int
 T,n;

int cmp(const void *a, const void *
b)
{//以s为主关键字,t为次关键字升序排列
    Node *p,*q;
    p 
= (Node *
)a;
    q 
= (Node *
)b;
    
if(p->!= q->
s)
        
return p->> q->
s;
    
else

        
return p->> q->t;
}


void Solve()
{
    
int
 t1,t2;
    
int i,j,k,cnt = 0
;
    
int ttime = 0
;
    
for(i = 0; i < n; i++
)
    
{//输入
        cin>>t1>>t2;
        
if(t1 <
 t2)
        
{table[i].s = t1;table[i].t = t2;}

        
else
        
{table[i].s = t2;table[i].t = t1;}
        table[i].mark 
= false;//未移动
    }

    qsort(table,n,
sizeof(Node),cmp);
    
for(i = 0; i < n; i++
)
        
if(table[i].mark == false
)
        
{
            table[i].mark 
= true;//当然这里标记是毫无意义的

            cnt++;
            k 
= i;j = i + 1
;
            
for(;j < n; j++
)
                
if(table[j].mark == false
)
                
if( table[k].t <
 table[j].s)
                
{
                    
if(table[k].t % 2
)
                        
if(table[j].s == table[k].t +1)continue
;
                    
//
有走廊的特殊性必须得考虑这种情况
                    
//就像(2,3) and (4,5)是不能同时进行的

                    table[j].mark = true;
                    k 
=
 j;
                    cnt
++
;
                    
if(cnt == n)break
;
                }

            ttime
++;
            
if(cnt == n)break
;
        }

    cout
<<ttime*10<<endl;
}


int main()
{
    
while(cin>>
T)
        
while(T--&&cin>>
n)
            Solve();
    
return 0
;
}

posted on 2009-03-04 16:54  Xredman  阅读(212)  评论(0编辑  收藏  举报

导航