题意:
n场婚礼
给定每场婚礼的开始和结束时间,要求每场婚礼至少举行一半以上(不包括一半)
如果可行输出YES,否则输出NO
思路:
算出每场婚礼的至少要举行的时间t, 最早的结束时间mid
以最早结束时间mid为第一变量,开始时间s为第二变量从小到大排序
用cnt记录举办完每场婚礼的结束时间
分三种情况:
①加参前当婚礼的时间够不一半
②果加参婚礼时婚礼已开始,结束时间就加上婚礼一半的时光
③婚礼没开始,结束时间就是婚礼的最早结束时间mid
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
int n;
struct node
{
int s, e, mid, t;
bool operator< (const node &rhs) const{
if(mid != rhs.mid) return mid < rhs.mid;
else return s < rhs.s;
}
}p[N];
int main()
{
while(~scanf("%d", &n))
{
if(n == 0) break;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &p[i].s, &p[i].e);
p[i].t = (p[i].e - p[i].s)/2 + 1;
p[i].mid = p[i].s + p[i].t;
}
sort(p, p+n);
bool flag = 0;
int cnt = p[0].mid;
for(int i = 1; i < n; i++)
{
if(cnt > p[i].e - p[i].t)
{
flag = 1; break;
}
if(cnt > p[i].s) cnt += p[i].t;
else cnt = p[i].mid;
}
if(flag) puts("NO");
else puts("YES");
}
return 0;
}