hdu1050解题报告

原题大意:在一个走廊两边都有对称分布的连续房间,现在有n张桌子需要从a移动到b房间。每次移动需要10分钟,但是如果两次移动中需要经过相同的走廊位置,则不能同时进行,需要分开移动。最后求最少需要多长时间移动完所有的桌子。

解题思路: 这还是一道贪心算法题目。这种题目解题很有技巧和公式。先画图分析下就知道了。



正如画图分析所知,只要求出n次移动过程当中每个走廊经过的次数,取最大值就是题解了。其实也就是n次移动过程中,最多会有多少次交叉。

代码编写: 其实,一开始没有想这样分析,第一反应是想直接采用模拟搬动过程: 每一轮循环中,找到不会交叉搬运的桌子。去掉。继续下一轮。这种方法也对。但是时间复杂度貌似会达到n^3。。基本就是超时的样子,所以没去写了。后来画图分析了下。发现挺简单的。最后放下AC代码吧。

#include <iostream>

using namespace std; 

const int MAXN = 202;

int count1[MAXN];

int main() {
	int t;
	cin>>t;
	while (t--) {
		int n;
		cin>>n;
		for (int i =0; i<MAXN; ++i)
			count1[i] = 0;
		for (int i =0; i<n; ++i) {
			int from, to;
			cin>>from>>to;
			if (to<from) {
				int tmp = to; to = from; from = tmp;
			}
			for (int j=(from+1)/2; j<=(to+1)/2; j++) {
				count1[j]++;
			}
		}
		int max = count1[0];
		for (int i =1; i<MAXN; ++i)
			if (count1[i]>max)
				max = count1[i];
		cout<<max*10<<endl;
	}
	
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值