牛客 切長條(貪心)

qq_45799727發表於2020-12-06

傳送門
排序方式
1.
左右邊界升序,右邊界優先

bool cmp(node a, node b) {
	if (a.end != b.end)
		return a.end <= b.end;
	return a.start<= b.start;
}
int res = 1;
	int tmp=cow[1].end;
	for (int i = 2; i <= n; ++i) {
		if (tmp <= cow[i].start) {
			res++;
			tmp = cow[i].end;
		}
	}

左邊界升序,右邊界更新

for (int i = 2; i <= n; ++i)
        {
            if (a[i].l >= minn)
            {
                ++ans;
                minn = a[i].r;
            }
            else
                minn = min(minn, a[i].r);
        }

在這裡插入圖片描述
else 部分
當加入第三個區間
將原來的右邊界(假設前面無區間)由綠星更新為紅星
否則區間不會加一

注意
不能只以右邊界排序
在這裡插入圖片描述
圖中情況應該切兩次,這種演算法只能算到一次

bool cmp(node a, node b) {
	return a.start<= b.start;
}
int res = 1;
	int tmp=cow[1].end;
	for (int i = 2; i <= n; ++i) {
		if (tmp < cow[i].start) {
			res++;
			tmp = cow[i].end;
		}
	}