[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;
	}
}

  

posted @ 2013-08-13 23:32  阿牧遥  阅读(649)  评论(0编辑  收藏  举报