hdu_2491_Priest John's Busiest Day

題意:

John要主持n場婚禮,每場婚禮必須主持超過該場婚禮的一半時間,John是否可以主持完n場婚禮。

分析:

貪心策略;

對於 每一場婚禮求出其中間時間,並按中間時間排序(從小到大排)。並算出John需要主持的時間。

代碼:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=100000+100;
struct Node
{
    int StarTime;
    int EndTime;
    int CostTime;//主持的時間
    int MidTime;//中間時間
}p[MAXN];
bool cmp(Node f1,Node f2)
{
    if (f1.MidTime!=f2.MidTime)
        return f1.MidTime<f2.MidTime;//中間時間不相等,小的排在前
    return
        f1.StarTime<f2.StarTime;//否則開始時間小的在前面
}
int main()
{
    int n;
    while (scanf("%d",&n)&&n)
    {
        for (int i=0;i<n;i++)
        {
            scanf("%d%d",&p[i].StarTime,&p[i].EndTime);
            p[i].CostTime=(p[i].EndTime-p[i].StarTime)/2+1;//主持的時間,必須+1,因爲要超過一半時間
            p[i].MidTime=p[i].StarTime+(p[i].EndTime-p[i].StarTime)/2+1;//中間時間
        }
        sort(p,p+n,cmp);
        int i;
        int cnt=p[0].MidTime;//cnt表示什麼時間點離開
        for (i=1;i<n;i++)
        {
            if (p[i].EndTime-p[i].CostTime<cnt)//參加第i場的時間到結束時間,主持時間不夠一半
                break;
            if (cnt>p[i].StarTime) cnt+=p[i].CostTime;//參加第i場時婚禮已經開始,
            else
                cnt=p[i].MidTime;//如果沒有開始則在中間時間離開
        }
        if (i==n)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章