zoukankan      html  css  js  c++  java
  • German Collegiate Programming Contest 2013-B:Booking(贪心)

        Booking

    Pierre is in great trouble today! He is responsible for managing the bookings for the ACM (Acco- modation with Moderate Costs) hotel and has just realized that the booking software has a severe   bug. It has created overlapping and wrong room assignments. Pierre is now worried that the hotel might be overbooked. Since the software manufacturer is neither very responsive nor competent, he must check this himself, so that he can timely take countermeasures if necessary.

    Fortunately, Pierre was able to export all original bookings (including reservation codes plus correct and valid dates of arrival and departure). The only information that got lost is the time of the booking placements, so that Pierre cannot retrieve any booking priorities (e.g., first-come-first-serve). Using  the available information, could you please help Pierre out and tell him a room assignment with the minimum number of rooms that satisfies all bookings? Please be aware that a room must always be cleaned before reuse. Since Pierre does not want to take any risks, he tells you to only consider the maximum cleaning time.

    Input

    The input consists of several lines. The first line contains 1 ≤ T ≤ 100, the number of test cases. Each test case starts with a line containing two integers 1 ≤ B ≤ 5 000, the number of bookings, and 0 ≤ C ≤ 360, the cleaning time (in minutes) for one room.

    Then follow B lines, each containing the reservation code (a random alphanumeric string of up 20 characters) and the dates of arrival and departure of one booking. Dates are given as strings in the format "YYYY-MM-DD HH:MM" (see example test case), where reservations are only for the years 2013 until 2016.

    Output

    For each test case, print the minimum number of needed rooms on a single line without any additional blanks. Be aware of leap years but ignore daylight saving time.

    Sample Input

    4
    2 120
    1 2013-07-01 15:59 2013-07-08 16:30
    2 2013-07-08 17:30 2013-07-15 12:00
    3 60
    65 2013-07-08 14:30 2013-07-08 16:00
    32 2013-07-01 16:00 2013-07-15 12:00
    91 2013-07-01 16:00 2013-07-08 15:00
    2 360
    a7 2016-02-21 14:00 2016-02-28 21:00
    xx 2016-03-01 01:00 2016-03-02 12:57
    2 60
    a9 2016-02-21 14:00 2016-02-28 11:00
    a8 2016-02-28 12:00 2016-03-11 21:00

    Sample Output

    2
    3
    1
    1

    题意

    有n个客人预订房间,但是客人预定的房间给弄乱了,Pierre打扫房间需要m分钟,给出客人预订房间的开始时间和结束时间,求最少要为客人准备多少间房间

    思路

    活动安排问题模板题,主要是讲给出来的年月日那个时间划分成一个统一的时间标准(以某一个时间作为时间的开始点,时间统一为和该时间点相差多少分钟),然后套模板就能过了(这么简单的题我竟然没有写,当时想到用这个贪心了,但是感觉过不了,就没写QAQ)

    活动安排问题讲解传送门:https://blog.csdn.net/wang_123_zy/article/details/79323417

    AC代码

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <set>
    #include <string>
    #define ll long long
    #define ull unsigned long long
    #define ms(a) memset(a,0,sizeof(a))
    #define pi acos(-1.0)
    #define INF 0x7f7f7f7f
    #define lson o<<1
    #define rson o<<1|1
    const double E=exp(1);
    const int maxn=1e5+10;
    const int mod=1e9+7;
    using namespace std;
    int times[12]={0,44640,84960,129600,172800,217440,260640,305280,349920,393120,437760,480960};
    int a[maxn],b[maxn];
    int main(int argc, char const *argv[])
    {
    	int t;
    	char ch[100];
    	int id,year,month,day,hour,minute;
    	scanf("%d",&t);
    	int n,m;
    	while(t--)
    	{
    		int ans=1;
    		scanf("%d%d",&n,&m);
    		for(int i=0;i<n;i++)
    		{
    			scanf("%s %d-%d-%d %d:%d",ch,&year,&month,&day,&hour,&minute);
    			if(year==2016&&month>2)
    	            a[i]=(year-2013)*525600+times[month-1]+(day-1)*1440+hour*60+minute+1440;
    	        else 
    	        	a[i]=(year-2013)*525600+times[month-1]+(day-1)*1440+hour*60+minute;
    			scanf("%d-%d-%d %d:%d",&year,&month,&day,&hour,&minute);
    			if(year==2016&&month>2)
    	            b[i]=(year-2013)*525600+times[month-1]+(day-1)*1440+hour*60+minute+1440;
    	        else 
    	        	b[i]=(year-2013)*525600+times[month-1]+(day-1)*1440+hour*60+minute;
    		}
    		int i,k;
    		sort(a,a+n);
    		sort(b,b+n);
    		int sum=0;
    		for(i=0,k=0;i<n;i++)
    		{
    			if(a[i]-b[k]<m) 
    				sum++;
    			else 
    				k++;
    		}
    		printf("%d
    ",sum);
    	}
    	return 0;
    }
  • 相关阅读:
    观察OnPaint与OnIdle与OnSize事件
    wxPython的Refresh与事件双重响应
    DLL的静态调用和动态调用
    Delphi String的散漫记录,真是知识无数,陷阱无数
    VC调用Delphi DLL
    终于理解了什么是LGPL
    安装postgresql碰到Unable to write inside TEMP environment path
    图解:Activity生命周期
    Dephi泛型
    传递双重指针申请内存,典型用法
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324366.html
Copyright © 2011-2022 走看看