一个牧师要去参加婚礼,要求牧师在婚礼上待的时间大于婚礼总时间。
先按中间时间进行排序,当相等时,按开始时间排序。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct node
{
int s,e;
int min,mmin;
}A[100001];
int cmp(const void*a,const void*b)
{
struct node *c,*d;
c=(struct node*)a;
d=(struct node*)b;
if(c->mmin!=d->mmin)return c->mmin-d->mmin;
else return c->s-d->s;
}
int main()
{
int n;
int i,t;
while(scanf("%d",&n)!=-1&&n)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&A[i].s,&A[i].e);
A[i].min=(A[i].e-A[i].s)/2+1;//一半的时间
A[i].mmin=A[i].min+A[i].s;//中间时间点
}
qsort(A,n,sizeof(A[0]),cmp);
t=A[0].s;
for(i=0;i<n;i++)
{
if(t>A[i].e-A[i].min)break;
if(t>=A[i].s)t+=A[i].min;//刚开始这有点迷了,牧师不一定在中间时刻开始或结束。。
else t=A[i].mmin;
}
if(i<n)printf("NO\n");
else printf("YES\n");
}
return 0;
}