zoukankan      html  css  js  c++  java
  • 【贪心】Moving Tables POJ 1083

    题目链接:http://poj.org/problem?id=1083

    题目大意:走廊上的房间如下图设置,现在有n个移动桌子的任务,把桌子从xi移动到yi(整个过程中会占用xi到yi房间之间的走廊),每次移动10分钟,可以同时进行但走廊只有一个桌子宽(即不能共用走廊)。问最少多少分钟。

    我们可以把移动桌子看成一个区间,有重叠部分的区间是不可以同时进行的。所以问题转换为了求区间重叠的最大个数。因为如图的房间设置,我们可以把奇数看做偶数(1看做2,3看做4,2k+1看做2k+2)。于是我们的数就变为了2、4、6...400。便于计算在除以2,即为1到200的正整数。

    在这里求一个点上的覆盖区间个数要用到差分的思想,用一个数组a来计算。对于一个区间[x,y],把a[x]++,a[y+1]--。那么你要统计一个点上区间个数就是它的前缀和。

    代码如下:

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int n,x,y,a[205],t;
    
    int main()
    {
    	scanf("%d",&t);
    	while(t--)
    	{
    		memset(a,0,sizeof a);
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d%d",&x,&y);
    			if(x&1)x++;if(y&1)y++;
    			x/=2,y/=2;
    			if(x>y)x^=y,y^=x,x^=y;
    			a[x]++;a[y+1]--;
    		}
    		int mx=0;
    		for(int i=1;i<=200;i++)
    			a[i]+=a[i-1],mx=a[i]>mx?a[i]:mx;
    		printf("%d
    ",mx*10);
    	}
    }
    
  • 相关阅读:
    &&和||解析
    SQL-union union all
    sql杂记
    JAVA杂记
    sql之left join、right join、inner join的区别
    蓝鲸邮箱配置
    快速部署社区版(详解)
    蓝鲸平台安装环境准备
    蓝鲸脚本集合
    zabbix3.4 install
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039519.html
Copyright © 2011-2022 走看看