zoj移动桌子(贪心算法)

问题描述:

著名的ACM(Advanced Computer Maker)公司租用了一栋楼的楼层,形状如下图。

该楼层沿走廊的北侧和南侧各有200间客房。近期,公司制定了体制改革计划。改革包括在房间之间移动很多桌子。因为走廊很窄,所有的桌子都很大,所以只有一张桌子可以通过走廊。需要一些计划以使移动有效。经理想出了以下计划:将一张桌子从一个房间搬到另一个房间可以在 10 分钟内完成。将桌子从房间 i 移动到房间 j 时,使用房间 i 前面和房间 j 前面之间的走廊部分。因此,在每 10 分钟内,将同时在不共享走廊同一部分的两个房间之间进行多次移动。

对于每个房间,最多可以搬入或搬出一张桌子。现在,经理寻找一种方法来最小化移动所有桌子的时间。你的工作是编写一个程序来解决管理者的问题。

输入:

输入由 T 个测试用例组成。测试用例的数量)(T 在输入的第一行中给出。每个测试用例都以包含整数 N 的行开始,1<=N<=200,表示要移动的表的数量。每个接下来的N行包含两个正整数s和t,表示一张桌子要从房间号s移动到房间号t(每个房间号在N行中最多出现一次)。从第N+3行开始,其余测试用例以与上述相同的方式列出。

输出:

输出应包含完成移动的最短时间(以分钟为单位),每行一个。

样品输入

3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50


样本输入的输出

10
20
30

算法分析:找出最多的重叠次数,由题知把上下房间对着的看成一个地方,比如1 2看成都在1这个地方,3 4,都在2这个地方5 6都在3这个地方,用数组book【】记录出现每个数次数。比如样例2 的1 3,2 200,相当于book[1]=1,book[2]=2,book[3]=2,book[4]=1...book[200]=1,找出次数出现最大值,最后乘以10.


#include<stdio.h>
#include<string.h>
 
int main()
{
	int t,n,i,j,d,book[210],k,m,m1,t1,max;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		memset(book,0,sizeof(book));
		d=10;max=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&m,&m1);
			if(m>m1)
			{
				t1=m1;
				m1=m;
				m=t1;
			}
			m=(m+1)/2;
			m1=(m1+1)/2;
			for(k=m;k<=m1;k++)
			book[k]++;
		}
		for(i=1;i<=200;i++)
		{
			if(book[i]>max)
			max=book[i];
		}
		printf("%d\n",max*10);
	}
	return 0;
}

yjg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值