1. 程式人生 > >模擬考試1 BestCoder Round #2 TIANKENG’s restaurant

模擬考試1 BestCoder Round #2 TIANKENG’s restaurant

本以為是區間覆蓋問題,如果有時間重疊的部分,就加上,雖然區間覆蓋掌握的也不是很好,不知道是按照起始時間還是離開時間排序,之後會再好好複習這方面的習題

起始程式碼

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node
{
    int st;
    int et;
    int num;
    friend bool operator < (node a, node b)
    {
        return a.st<b.st;
    }
}ma[10010];
int main()
{
    int t,n,m;
    scanf("%d",&t);
    int a,b,c,d;
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d %d:%d %d:%d",&m,&a,&b,&c,&d);
            ma[i].st=a*60+b;
            ma[i].et=c*60+d;
            ma[i].num=m;
        }
        sort(ma,ma+n);
        //for(int i=0; i<n; i++)
        //{
          //  printf("%d %d %d\n",ma[i].num,ma[i].st,ma[i].et);
        //}
        int mint=ma[0].st,maxt=ma[0].et;
        int ans=ma[0].num;
        for(int i=1; i<n; i++)
        {
            if(maxt>ma[i].st)
            {
                maxt=ma[i].et;
                ans+=ma[i].num;
            }
        }
        printf("%d\n",ans);
    }
}

後來學到了按照離開時間進行排序(也不知道為什麼),還有ans的更新,但是也是錯的,原來這不是區間覆蓋問題,而是在連續區間覆蓋的時候,第一個區間走之後的椅子可以供下一個區間和下下個區間的人使用,看了正解就自然明白了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1000010];
int main()
{
    int t,n,s;
    int i,j;
    int max;
    int hour1,hour2,min1,min2;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));//一開始要清零
        scanf("%d",&n);
        max=-100;//紀錄最小的座位
        for(i=0;i<n;++i)
        {
            scanf("%d %d:%d %d:%d",&s,&hour1,&min1,&hour2,&min2);//s表示這個時間段來的人數
            int sum1=hour1*60+min1;//每個時間都有一個sum1和sum2這個區間
            int sum2=hour2*60+min2;

            for(j=sum1;j<sum2;++j)//當兩區間有公共部分時,陣列a[i]剛才也存了一個數了
            {
                a[j]+=s;
                //printf("%d ",a[j]);
                if(a[j]>max)//當陣列a紀錄的座位數大於max,要把max更新
                    max=a[j];
            }
            //printf("\n");
        }
        printf("%d\n",max);
    }
    return 0;
}