hdoj1050 moving tables 贪心 最大重叠区间数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050

题意:一个过道,两排房间,搬桌子,不能造成交通堵塞,求最短时间。稍微思考一下就是求最大重合区间数。注意: 1 3 4 5  答案 是 20,那么按照我前面博客的方法求最大重叠区间的话,就行不通了,原因呢就是因为两排房间的构造造成的,我们可以这样修改:

1,如果的start为偶数,那么start-=1。

2,如果end为奇数,end+=1。

这样做的原因嘛,就是在不违背要求的前提下,加长区间长度,画个草图是很好理解的。还有一点就是:给的start不一定小于end,例如会出现(80,30)这样的。题目没明确告诉你的条件不要瞎猜,就像有时候题目没告诉你说有序,但很可能样例是有序的,你要用这个条件时,就一定要sort。USACO的一贯套路...

code:
#include<cstdio>
#include<algorithm>
#define MAX(a,b) (a>b?a:b)
using namespace std;
const int MAXN=200+5;
int in[MAXN],out[MAXN];
int main(void){
    int T;scanf("%d",&T);
    while(T--){
        int N;scanf("%d",&N);
        for(int i=0;i<N;++i){
            int a,b;scanf("%d%d",&a,&b);
            if(a>b)swap(a,b);
            if(b&1)++b;
            if(a%2==0)--a;
            in[i]=a;out[i]=b;
        }
        sort(in,in+N);
        sort(out,out+N);
        int i=0,j=0,sum=0,res=0;
        while(i<N&&j<N){
            while(i<N&&in[i]<out[j]){++i;++sum;}
            res=MAX(sum,res);
            while(j<N&&out[j]<in[i]){++j;--sum;}
            if(in[i]==out[j]){++i;++j;}
           // printf("i=%d,j=%d\n",i,j);
        }

        printf("%d\n",res*10);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值