链接:https://ac.nowcoder.com/acm/contest/6106/K
来源:牛客网
题目描述
训练师小梁最近因为输了道馆赛,所以她想要变强。经过一番努力后,她总结出了让大家变强的秘诀 —— “时间管理”。于是她给自己安排了一个“时间管理”的特训。
特训有n(1≤n≤100000)个增加宝可梦亲密度的游戏,已知这些游戏的开始时间s和结束时间e(0≤s<e≤2∗109),每个游戏都必须连续玩一半以上的时间。问小梁能否使用“时间管理”这个秘诀,完成所有的游戏。输入描述:
输入一个n(1≤n≤100000),表示提高亲密度游戏的数量; 输入n行 ,每行输入s,e(0≤s<e≤2∗109)表示第i个游戏的开始时间和结束时间。
输出描述:
输出YES或NO
示例1
输入
4 1 7 4 9 10 15 8 12
输出
YES
说明
例如 1 7 时间段长度为 6 ,那么要玩至少4的时间
思路:贪心。先算出每个游戏的最早结束时间,按照最早结束时间升序排序,如果相同则按照开始时间升序排序。因为要连续且完成一半以上,所以先做比较早结束的游戏是容易想到的,如果结束时间相同,那么先做早开始的游戏也是易想的,然后我们遍历一遍,如果当前的最早结束时间大于了下一个游戏的结束时间-他要玩的时间,结束(因为下一个游戏已经不能完成了),否则,更新相应的结束时间。
AC示例代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <string> #define cla(a, sum) memset(a, sum, sizeof(a)) #define rap(i, m, n) for(int i=m; i<=n; i++) #define rep(i, m, n) for(int i=m; i>=n; i--) #define bug printf("???\n") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll> P; const int Inf = 0x3f3f3f3f; const double eps = 1e-8; const int maxn = 1e5+5; template <typename T> void read(T &x){ x = 0; int f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar();} x *= f; } ll n; struct node{ ll s,e,se; }f[maxn]; bool cmp(node u,node v){ if(u.se ==v.se )return u.s <v.s ; return u.se <v.se ; } int main() { cin>>n; ll u,v; ll ans; rap(i,1,n){ scanf("%lld%lld",&u,&v); f[i].s =u;f[i].e =v; ans=f[i].e -f[i].s ; ans=ans/2+1+f[i].s ; f[i].se =ans;//结束时间 } sort(f+1,f+n+1,cmp); ll ok=0,c=0;//初始化结束时间c for(int i=1;i<=n;i++){ ans=f[i].e -f[i].s ; ans=ans/2+1; if(c<=f[i].s){//结束时间小于下一个游戏的开始时间 c=f[i].s +ans; } else if(c<=f[i].e -ans){//结束时间大于或等于下一个游戏的开始时间 c=c+ans; } else {//不成立 ok=1;break; } } if(!ok)printf("YES"); else printf("NO"); return 0; }