题意:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 2491 Priest John's Busiest Day(贪心)
原文:http://blog.csdn.net/doris1104/article/details/47731531