HDU 1050 Moving Tables

来源:互联网 发布:台湾留学生在大陆知乎 编辑:程序博客网 时间:2024/06/05 19:01

题意:给定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;}
0 0
原创粉丝点击