首页 > 其他 > 详细

HDU 3700 Cat

时间:2014-09-09 13:06:08      阅读:402      评论:0      收藏:0      [点我收藏+]

Cat

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 451    Accepted Submission(s): 100
Special Judge


Problem Description
There is a cat, cat likes to sleep. 
If he sleeps, he sleeps continuously no less than A hours.
For some strange reason, the cat can not stay awake continuously more than B hours.
The cat is lazy, it could sleep all the time, 
but sometimes interesting events occur(such as cat food, TV show, etc) . 
The cat loves these events very much.
So, Please help the cat plan their day so as not to miss any interesting events. 
Every day the cat wants to live on the same schedule.
 

Input
The first line of the input file contains two integers A and B (1 <= A, B <= 24). 
The second line of the input file contains the number n, the number of interesting events (1 <= n <= 20). 
Following n rows describe the interesting events. 
Each event is described line of the form hh:mm-hh:mm, which specifies
the time period during which it occurs. Time varies from 00:00 to 23:59. 
No two interesting events will overlap.
If the event is completed earlier than the beginning, This means that it captures midnight.
The event is considered to be occupying the whole minute, 
when it begins and the moment when it ends (event 12:00-13:59 lasted exactly 120 minutes). Start time and time end of the event are different.
 

Output
If the cat can organize their day so that during all the interesting events not sleep, print to output file Yes.

On the second line Bring k - how many times a day cat should go to bed. 
In the following k rows Bring out the intervals in which the cat sleeps in the same format, in which interesting events are set in the input file. If making a few, display any.

If the cat can not organize their day desired way, print to the output file No.
 

Sample Input
12 12 1 23:00-01:00 3 4 3 07:00-08:00 11:00-11:09 19:00-19:59
 

Sample Output
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;
}


HDU 3700 Cat

原文:http://blog.csdn.net/hqu_fritz/article/details/39138317

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!