1. 程式人生 > >Uestc 1652 Grab a hole(貪心+列舉)

Uestc 1652 Grab a hole(貪心+列舉)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef struct
{
    int s,t;
}ract;
ract r[503];
int line[503];
bool cmp(ract r1,ract r2)
{
    if(r1.s==r2.s) return r1.t<r2.t;
    return r1.s<r2.s;
}

int main()
{
    int t,pos=0;
    scanf("%d",&t);
    while(t--)
    {
        memset(line,-1,sizeof
(line));
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;++i)
        {
            scanf("%d %d",&r[i].s,&r[i].t);
        }
        sort(r,r+n,cmp);
        int k=0;
        for(int i=0;i<n;++i)
        {
            if(line[r[i].t]==-1)//如果右端點的洞是空的            {
                line[r[i].t]=i;
            }
            else

            {
                int flag=0,temp=i;
                if(r[i].t>1)
                 for(int j=r[i].t-1;j>=1;--j)//向前遍歷,是否已住滿                 {
                     if(line[j]==-1) {flag=1;break;}
                 }
                 if(flag==1)
                for(int j=r[i].t;j>=1;--j)//如果沒有住滿就向前遍歷
                {
                    if(line[j]==-1)//遇到空洞就住下                    {
                        line[j]=temp;
                        if(r[temp].s>j)
                        k=max(k,r[temp].s-j);//更新K值                        break;
                    }
                    else if(r[line[j]].s<r[temp].s)//如果當前洞中的老鼠的左端點小於移動的老鼠的左端點,就交換                    {
                        int tmp2=line[j];
                        line[j]=temp;
                        if(r[temp].s>j)
                        k=max(k,r[temp].s-j);
                        temp=tmp2;
                    }
                }
                else
                {
                    for(int j=r[i].t;j<=n;++j)//如果已經住滿就向後遍歷                    {
                        if(line[j]==-1)
                        {
                            line[j]=temp; 
                            if(r[temp].t<j)
                            k=max(k,j-r[temp].t);
                            break;
                        }
                        else
                        {
                            if(r[line[j]].t>r[temp].t)
                            {
                                int tmp2=line[j];
                                line[j]=temp;
                                if(r[temp].t<j)
                                 k=max(k,j-r[temp].t);
                                 temp=tmp2;
                            }
                            
                        }
                    }
                }
            }

        }
        printf("Case #%d: %d\n",++pos,k);

    }
    return 0;
}