hdoj 3229 Distant Galaxyg

来源:互联网 发布:网络推广文案的区别 编辑:程序博客网 时间:2024/04/30 05:35

给出平面上的n个点(n<=100),找一个矩形,使得边界上包含尽量多的点。

对所有的点进行排序,在对纵坐标排序

枚举上界下界a,b;

用left[i]表示竖线左边位于上下边界上的点数(不包括该竖线上的点 ),on[i] 和on2[i],表示竖线上位于上下边界之间的点数(on[i]不统计位于上下边界的点数,而on2[i]要统计)

这样给定左右边界i,j,矩形边界上的点数为left[j]-left[i]+on[i]+on2[j].

当右边界j确定时,on[i]-left[i]应最大。

#include<cstdio>#include<algorithm>using namespace std;struct Point{      int x,y;      bool operator < (const Point& rhs) const {      return x<rhs.x;      }};const int maxn =100+10;Point P[maxn];int n,m,y[maxn],on[maxn],on2[maxn],left[maxn];int solve(){        sort(P,P+n);        sort(y,y+n);        m=unique(y,y+n)-y;//所有不同的y坐标的个数        if(m<=2) return n;        int ans=0;        for(int a=0;a<m;a++)        {                for(int b=a+1;b<m;b++)//枚举上界下界分别为ymin,ymax;                {                        int ymin=y[a],ymax=y[b];                        int k=0;                        for(int i=0;i<n;i++)                        {                                if(i==0||P[i].x!=P[i-1].x)//一条新的竖线                                {                                        k++;                                        on[k]=on2[k]=0;                                        left[k]=k==0?0:left[k-1]+on2[k-1]-on[k-1];                                }                                if(P[i].y>ymin&&P[i].y<ymax)                                        on[k]++;                                if(P[i].y>=ymin&&P[i].y<=ymax) on2[k]++;                        }                        if(k<=2) return n;                        int M=0;                        for(int j=1;j<=k;j++)                        {                                ans=max(ans,left[j]+on2[j]+M);                                M=max(M,on[j]-left[j]);                        }                }        }        return ans;}int main(){        int kase=0;        while(scanf("%d",&n)==1&&n)        {                for(int i=0;i<n;i++)                {                        scanf("%d%d",&P[i].x,&P[i].y);                        y[i]=P[i].y;                }                printf("Case %d: %d\n",++kase,solve());        }        return 0;}



0 0