题目大意:有一个司仪,要主持 n 场婚礼,给出婚礼的起始时间和终止时间,每个婚礼需要超过一半的时间做为仪式,并且仪式不能终止。问说司仪能否主持 n 场婚礼。
解题思路:贪心,为了尽量主持多的婚礼,每场的仪式时间就一定要尽量短 d = (t - s) / 2 + 1,(因为必须大于一半,所以加 1)。然后按照每场婚礼可以最晚结束的时间排序 t - d,(因为要满足所有的婚礼,所以尽量解决早点的仪式,腾出时间来给后面的婚礼),维护一个占用时间值即可。
#include
#include
using namespace std; struct Wedding { int S, T, D; bool operator < (const Wedding& a) const { return T - D < a.T - a.D; } } W[100010]; bool judge(int N) { int cur = 0; for (int i = 0; i < N; i++) { cur = max(cur, W[i].S) + W[i].D; if (cur > W[i].T) return false; } return true; } int main() { int N; while (scanf(%d, &N) && N) { for (int i = 0; i < N; i++) { scanf(%d%d, &W[i].S, &W[i].T); W[i].D = (W[i].T - W[i].S) / 2 + 1; } sort(W, W + N); printf(%s , judge(N) ? YES : NO); } return 0; }
?