2008 北京区域赛 Priest John's Busiest Day

/*



题目:

    有n对新人,他们的婚礼时间分别为[s,t],他们的习俗是需要牧师能够对新人

    进行祝福,要求牧师的祝福时间超过他们婚礼的持续时间的一半。问只有一个

    牧师的话能不能成功主持所有这样婚礼



分析:

    贪心,可以先求出所有新人所需要祝福的时间,由于改时间超过婚礼的一半,

    所以在[s,t]的中间时刻一定是要祝福新人,比如[1,5]时,2,3,4均要祝福;

    [1,4]时,2,3需要祝福,所以可以定义

    ms:必须在祝福的最晚起始时间,

    me:必须在祝福的最早终止时间。

    我们通过对ms进行排序,若相等则按me进行排序,再判断是否符合即可



*/

#include <cstdio>

#include <iostream>

#include <cstring>

#include <algorithm>



using namespace std;



const int X = 100005;



int n;



struct node

{

    int s,e;

    int ms,me;

    int mid;

    friend bool operator < (node a,node b)

    {

        return a.ms<b.ms||(a.ms==b.ms&&a.me<b.me);

    }

}p[X];



int main()

{

    freopen("sum.in","r",stdin);

    freopen("sum.out","w",stdout);

    while(scanf("%d",&n),n)

    {

        for(int i=0;i<n;i++)

        {

            scanf("%d%d",&p[i].s,&p[i].e);

            p[i].ms = (p[i].s+p[i].e-1)>>1;

            p[i].me = p[i].ms+1;

            if(!((p[i].s+p[i].e)&1))

                p[i].me++;

            p[i].mid = (p[i].e-p[i].s+2)>>1;

        }

        sort(p,p+n);

        bool flag = false;

        int temp = p[0].me;

        for(int i=1;i<n;i++)    //主要算法

        {

            if(temp<=p[i].s)    //还没或者恰好到该位置的起始时间

            {

                temp = p[i].me;

                continue;

            }

            temp += p[i].mid;

            if(temp>p[i].e)

            {

                flag = true;

                break;

            }

        }

        flag?printf("NO\n"):printf("YES\n");

    }



    return 0;

}

 

你可能感兴趣的:(2008)