12 12 1 23:00-01:00 3 4 3 07:00-08:00 11:00-11:09 19:00-19:59
Yes 1 01:07-22:13 No细节很多,比赛的时候卡了全场,实在是感人肺腑,不能多说#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <set> #include <map> #include <list> #include <queue> #include <stack> #include <deque> #include <vector> #include <bitset> #include <cmath> #include <utility> #define Maxn 100005 #define Maxm 1000005 #define Inf (1LL<<62) #define inf 0x3f3f3f3f #define eps 1e-8 #define lowbit(x) x&(-x) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PI acos(-1.0) #define make_pair MP #define LL long long #define re freopen("in.txt","r",stdin) #define wr freopen("out.txt","w",stdout) using namespace std; struct Node { int st,ed,t; bool friend operator <(Node a,Node b) { return a.st<b.st; } }time[25],ans[25]; int main() { int a,b,n,h1,h2,m1,m2,k,Max; bool flag; //re;wr; while(~scanf("%d%d%d",&a,&b,&n)) { Max=0; k=0; flag=true; memset(ans,0,sizeof(ans)); for(int i=0;i<n;i++) { scanf("%02d:%02d-%02d:%02d",&h1,&m1,&h2,&m2); time[i].st=h1*60+m1;time[i].ed=h2*60+m2; if(time[i].ed<time[i].st) time[i].ed+=1440; time[i].t=time[i].ed-time[i].st+1; Max=max(Max,time[i].t); } if(Max>b*60) { puts("No"); continue; } int tt=1440-time[0].t; if(n==1) { if(tt>=a*60) { puts("Yes"); puts("1"); int hh1=((time[0].ed+1)/60)%24; int mm1=(time[0].ed+1)%60; int hh2=time[0].st-1>=0?((time[0].st-1)/60)%24:23; int mm2=((time[0].st-1)+60)%60; printf("%02d:%02d-%02d:%02d\n",hh1,mm1,hh2,mm2); } else puts("No"); continue; } sort(time,time+n); tt=time[0].st+1440-time[n-1].ed-1; int tmp; if(tt>=a*60) tmp=0; else { tmp=tt+time[n-1].t; int p=n-1; while(p>=1&&time[p].st-time[p-1].ed-1<a*60) { tmp+=time[p].st-time[p-1].ed-1+time[p-1].t; p--; } } for(int i=0;i<n;i++) { tmp+=time[i].t; if(tmp>b*60) { flag=false; break; } if(i!=n-1) { if(time[i+1].st-time[i].ed-1>=a*60) { ans[++k].st=time[i].ed+1; ans[k].ed=time[i+1].st-1; tmp=0; } else tmp+=time[i+1].st-1-time[i].ed; if(tmp>b*60) { flag=false; break; } } } if(tt>=a*60) { k++; ans[k].st=time[n-1].ed+1;ans[k].ed=time[0].st-1; } if(flag&&k) { puts("Yes"); printf("%d\n",k); for(int i=1;i<=k;i++) { int hh1=(ans[i].st/60)%24; int mm1=(ans[i].st+60)%60; int hh2=ans[i].ed>=0?(ans[i].ed/60)%24:23; int mm2=(ans[i].ed+60)%60; printf("%02d:%02d-%02d:%02d\n",hh1,mm1,hh2,mm2); } } else puts("No"); } return 0; }
原文:http://blog.csdn.net/hqu_fritz/article/details/39138317