[topcoder]FlowerGarden

1.此题很勉强算DP。找了半天网上思路,是个三层的循环,n^3。
2.基本思路就是先找到在第一个位置的花。这样就双层遍历,找到所有和其他不冲突的花中最高的一个,然后放到结果的首位。然后去掉此花,继续使用此方法对余下花朵。
3.要注意的是首先不能直接排序,比如a和b,b和c有冲突,但a和c不一定有冲突。
4.判断两段是否重叠的最简单式子是!(a.start > b.end || b.start > a.end)

思路来自:http://apps.topcoder.com/forums/?module=Thread&threadID=655393&start=0&mc=6#1766488 里面还有一个图形的方法,没仔细看。

public class FlowerGarden {
	public int[] getOrdering(int[] height, int[] bloom, int[] wilt) {
		int len = height.length;
		if (len == 0) return height; // assert length != 0
		int order[] = new int[len];
		boolean used[] = new boolean[len];

		for (int i = 0; i < len; i++) {
			int mxH = 0;
			int pos = -1;
		
			for (int j = 0; j < len; j++) {
				if (used[j]) continue;
				boolean found = true;
				for (int k = 0; k < len; k++) {
					if (used[k]) continue;
					boolean blocking = !(bloom[j] > wilt[k] || bloom [k] > wilt[j]);
					if (height[j] > height[k] && blocking) {
						found = false;
						break;
					}
				}
				if (found) {
					if (height[j] > mxH) {
						mxH = height[j];
						pos = j;
					}
				}
			}
			order[i] = height[pos];
			used[pos] = true;
		}
		return order;
	}
}

  

转载于:https://www.cnblogs.com/lautsie/p/3256269.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值