题意:给定T组样例,每一组给定一个n,接下来n行每行给出s和t,代表将桌子从s房间到b房间,移动时占用对应段的走廊,所以同一段走廊不能同时被使用,一次移动需要10分钟。问最短时间。
思路:贪心。选取第一组未被移动的s和t,然后不断选取能并列移动的s和t,移动将改变目前的t,碰到的第一组不能并列移动的作为下一批移动的第一个。
注意点:s不一定大于t。房间号不重要,关键是占据了哪一段走廊。
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1000+5;
typedef pair<int,int> pp;
pp p[MAX_N];
int n;
bool cmp(pp p1,pp p2)
{
return p1.first<p2.first;
}
bool sol()
{
for(int i=0;i<n;i++){
if(p[i].first!=-1) return false;
}
return true;
}
int main()
{
int T;
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].first>>p[i].second;
if(p[i].first>p[i].second) swap(p[i].first,p[i].second);
}
sort(p,p+n,cmp);
int ans=0,en,st=0;
while(++ans){
en=p[st].second;
p[st].first=-1;
int flag=1;
for(int i=st;i<n;i++){
if(p[i].first!=-1){
if(flag){
if((p[i].first%2==1&&en>=p[i].first)||(p[i].first%2==0&&en>=p[i].first-1)){
st=i;
flag=0;
}
}
if((p[i].first%2==1&&en<p[i].first)||(p[i].first%2==0&&en<p[i].first-1)){
en=p[i].second;
p[i].first=-1;
}
}
}
if(sol()) break;
}
cout<<ans*10<<endl;
}
return 0;
}