HDU 1050 Moving Tables(贪心)

来源:互联网 发布:js 计算时间间隔 天 编辑:程序博客网 时间:2024/06/06 00:53




http://acm.hdu.edu.cn/showproblem.php?pid=1050








题目大意:

在走廊的北边和南边各有200个房间    最近公司做出一个计划打算改革这个体系   这个改革就包括在这些房间之间移动很多桌子  因为走廊很狭窄   然后所有的桌子都很大    一次只有一个桌子能够通过这个走廊    这个计划需求就是要这个移桌子的过程更加有效率    经理弄清了这个计划定义:

1.把桌子从一个房间移动到另一个房间的时间是十分钟

2.当把一个桌子从i房间移动到j房间,这个走廊的i部分到j部分就是被使用过的。所以,在这个10分钟内,在这两个房间之间的走廊部分是不能再同时被使用的。

分析:

这个问题其实就是求最大重叠区域   因为在重叠区域是不能同时搬动多个桌子的   只有在一个搬完然后再其他搬   

而非重叠区域搬桌子就可以同时进行    由于房间在南北两侧    所以  1->5 和 2->6  是不能同时进行的   要想求重叠的走廊区域    也很简单    1号房间和2号房间门前有一块公共走廊   我们就将   这一块块的走廊进行编号  从左到右依次是1、2、3、4、5。。。。。    我们发现房间门前的走廊编号刚好可以由   (房间号+1)/2   求得    基于此我们就可以求最大重叠区域了  也就是求经过得公共走廊的最大值





AC代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int count0[205];int main (){    int t;    scanf ("%d",&t);    while (t--){        int n;        scanf ("%d",&n);        memset(count0,0,sizeof(count0));        int maxn=-1;        for(int i=0;i<n;i++){            int l,r;            scanf ("%d%d",&l,&r);            if (l>r){//    如果从大放假走向小房间  就换一下                 swap(l,r);            }            l=(l+1)/2;//   将房间号变成走廊号             r=(r+1)/2;            for (int i=l;i<=r;i++){                 count0[i]++;                if (maxn<count0[i]){//    找到最大重叠                     maxn=count0[i];                }            }        }        printf ("%d\n",maxn*10);    }    return 0;}