题意:
有一个司仪,要主持n场婚礼,给出婚礼的起始时间和终止时间,每个婚礼需要超过一半的时间做为仪式,并且仪式不能终止。
问说司仪能否主持n场婚礼。
解析:
贪心,为了尽量主持多的婚礼,每场的仪式时间就一定要尽量短time=(R−L)/2+1(因为必须大于一半,所以加1)。
然后按照每场婚礼可以最早结束的时间排序,结束时间为R−time(因为要满足所有的婚礼,所以尽量解决早点的仪式,腾出时间来给后面的婚礼),如果结束时间相同,那么按照起始时间排序,最后维护一个占用时间值即可。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 100005;
struct Node {
int L, R, last, len;
Node() {}
Node(int _L, int _R) {
L = _L, R = _R;
len = (R - L)/2 + 1;
last = R - len;
}
} node[N];
int n;
bool cmp(Node a, Node b) {
if(a.last != b.last)
return a.last < b.last;
return a.L < b.L;
}
bool judge() {
int end = node[0].L + node[0].len, start;
for(int i = 1; i < n; i++) {
if(node[i].last < end) return false;
start = max(node[i].L, end);
end = start + node[i].len;
if(end > node[i].R) return false;
}
return true;
}
int main() {
int L, R;
while(scanf("%d", &n) != EOF && n) {
for(int i = 0; i < n; i++) {
scanf("%d%d", &L, &R);
node[i] = Node(L, R);
}
sort(node, node+n, cmp);
printf("%s\n", judge() ? "YES" : "NO");
}
return 0;
}