南阳理工学院OJ_220_推桌子

最后是用了最大覆盖方法做的,不会超时,前面注释部分贪心策略估计也许应该错了,求大神帮忙指出

 

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cmath>

#include<cstring>

#include<string>

using namespace std;

/*struct point

{

    int x,y;

}p[220];

bool cmp(point a,point b)

{

    if(a.y==b.y) return a.x>b.x;

    return a.y<b.y;

}

int main()

{

 int t,n,s,e,i;

 cin>>t;

 while(t--)

 {

     scanf("%d",&n);

     for(i=0;i<n;++i)

     {

         scanf("%d%d",&s,&e);

         s=(s+1)/2;

         e=(e+1)/2;

         if(s>e) swap(s,e);

         p[i].x=s;

         p[i].y=e;

     }

     sort(p,p+n,cmp);

     int len=n-1,tot=0,mark;

     while(len)

     {

         mark=0;

         for(i=0;i<n;++i)

             if(p[i].x>mark)

             {

                 mark=p[i].y;

                 p[i].x=-1;

                 len--;

             }

             tot++;

     }

     printf("%d\n",tot*10);

 }

 return 0;

}*/

int main()

{

    int t,n,i,a,b,re[205],j;

    cin>>t;

    while(t--)

    {

        cin>>n;

        memset(re,0,sizeof(re));

        for(i=0;i<n;++i)

        {

            scanf("%d%d",&a,&b);

            a=(a+1)>>1;

            b=(b+1)>>1;

            if(a>b) swap(a,b); //注意题目并没有说a一定小于b

            for(j=a;j<=b;++j)

                re[j]++;

        }

        int Max=0;

        for(i=1;i<202;++i)

            Max=max(Max,re[i]);

        printf("%d\n",Max*10);

    }

    return 0;



}        

 

你可能感兴趣的:(OJ)