HDU 1050 Moving Tables

题意:给定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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值