HDU1050 Moving tables

题目大意:在一个长走廊里面搬桌子,走廊的两侧都是房间,把桌子从一个房间搬到另一个房间,走廊的宽度每次只允许搬一个桌子,每次搬桌子需要10分钟,问最少多长时间办完。

输入:第一个数t代表测试用例,接下里是n,表示要搬的桌子的总数,接着n行代表每个桌子从房间i搬到房间j

输出:最少需要的时间


解题思路:

        首先考虑,给出的每次需要搬的房间号,实际情况中是可能从大的房间号往房间号小的房间搬,因此,在读入数据时刻同时做一个方便接下来的处理的操作,就是保证每次都是从房间号小的朝着大的搬,结果是一样的(因为对于占用走廊的情况是相同的)

        另一方面,可以想到通过进行某种处理来标示这段走廊已被占用,通过累加这种走廊的重叠占用情况,来得到最大的重叠数。由于1-400个房间是在走廊两侧双向分布的,所以房间1和房间2是公用的同一段走廊,因此在累积标识的时候可以采用一个count[205]数组。


代码如下:

# include <iostream>
# include <algorithm>
using namespace std;

int main()
{
	//freopen("input.txt","r",stdin);
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,time;
		scanf("%d",&n);
		int count[205];
		memset(count,0,sizeof(count));
		int i,j,x,y,s,e;
		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&x,&y);
			if(x>y)
			{
				int temp;
				temp=x;
				x=y;
				y=temp;
			}
			s=(x+1)/2;
			e=(y+1)/2;
			for(j=s;j<=e;j++)
			{
				count[j]++;
			}
		}
		int maxc=0;
		for(i=1;i<201;i++)
		{
			if(maxc<count[i])
				maxc=count[i];
		}
		time=maxc*10;
		printf("%d\n",time);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值