UVA - 1382 Distant Galaxy

原创 2013年12月02日 23:13:53

题意:给出平面上的n个点,找到一个矩形,使得边界上包含尽量多的点

思路:如果单纯的枚举四条边再计数的话显然时间是不够的,,所以我们可以只枚举上下边界,用on[i],on2[i]表示竖线上位于上下边界之间的点数(区别在on[i]不统计位于上下边界上的点),这样,给定左右边界i,j的时候,矩形边界上的点数为left[j]-left[i]+on[i]+on2[j],当右边界确定的时候,on[i]-left[i]应最大,不断的去维护它的最大值就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 110;

struct point{
    int x,y;
    bool operator < (const point &s)const {
        return x < s.x;
    }
}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;
    if (m <= 2)
        return n;
    int ans = 0;
    for (int a = 0; a < m; a++)
        for (int b = a+1; b < m; b++){
            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] = 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 cas = 0;
    while (scanf("%d",&n) != EOF && 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",++cas,solve());
    }
    return 0;
}



uva1382 Distant Galaxy

离散化+前缀和+扫描
  • sdfzyhx
  • sdfzyhx
  • 2016年11月12日 22:14
  • 111

UVa:1382 Distant Galaxy

错了一个小地方调了一上午。。跪。。 首先要将所有点离散化,这里注意所有出现的数字最多是不只100个的,因为有x和y两个坐标,所以数组要开200。 特判只有一行的情况。其他时候枚举上下两行,注意此时...
  • kkkwjx
  • kkkwjx
  • 2014年03月08日 11:38
  • 677

UVa 1382 Distant Galaxy 解题报告(枚举 + 前缀和)

1382 - Distant Galaxy Time limit: 3.000 seconds You are observing a distant galaxy using a teles...
  • kbdwo
  • kbdwo
  • 2014年07月18日 16:38
  • 747

uva 1382 Distant Galaxy (枚举)

uva 1382 Distant Galaxy You are observing a distant galaxy using a telescope above the Ast...

UVA 1382 Distant Galaxy

跟书上的思路一样的, #include #include #include #include #include using namespace std; vector all_rows;...

【瞎搞】 HDU 3299 Distant Galaxy 枚举

line表示矩阵横边上的点 on1表示左边竖边shang

LA 3695 Distant Galaxy(扫描线)

Distant Galaxy Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on U...

【Jason's_ACM_解题报告】Distant Galaxy

Distant Galaxy 解题报告

Distant Galaxy

Description You are observing a distant galaxy using a telescope above the Astronomy Tower, and you ...

UVALive 3695 Distant Galaxy(枚举)

题意:给出平面上的n个点,找出一个矩形,使得边界上包含尽量多的点。 思路:直接离散化暴力的话复杂度是O(n^4),考虑离散化后原图形就变成了一个矩形,其中有点的位置值为1,没有点的位置值为0。 这就转...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA - 1382 Distant Galaxy
举报原因:
原因补充:

(最多只允许输入30个字)