贪心,考虑连廊的特殊性即可过了
#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->s != q->s)
return p->s > q->s;
else
return p->t > 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;
}

转载于:https://www.cnblogs.com/Xredman/archive/2009/03/04/1403197.html