題意:
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;
}