LA 3695 Distant Galaxy

给出n个点的坐标(坐标均为正数),求最多有多少点能同在一个矩形的边界上。

题解里是构造了这样的几个数组,图中表示的很明白了。

首先枚举两条水平线,然后left[i]表示竖线i左边位于水平线上的点,on[i]表示位于竖线i上两条水平线之间(并不在水平线上)的点数,on2[i]表示位于竖线i上两条水平线之间加上水平线边界上的点数。

所以矩形框上的点数为:

left[j]-left[i]+on[i]+on2[j]

枚举右边界竖线j,j确定后维护on[i]-left[i]的最大值。

 1 //#define LOCAL
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int maxn = 100 + 10;
 8 int n, m, y[maxn], on[maxn], on2[maxn], left[maxn];
 9
10 struct Point
11 {
12     int x, y;
13     bool operator < (const Point& rhs) const
14     {
15         return x < rhs.x;
16     }
17 }p[maxn];
18
19 int solve()
20 {
21     sort(p, p + n);
22     sort(y, y + n);
23     m = unique(y, y + n) - y;    //m为不同y坐标的个数
24     if(m <= 2)
25         return n;
26
27     int ans = 0;
28     for(int a = 0; a < m; ++a)
29         for(int b = a + 1; b < m; ++b)
30         {
31             int ymin = y[a], ymax = y[b];
32
33             //计算left, on, on2
34             int k = 0;    //k记录竖线的条数
35             for(int i = 0; i < n; ++i)
36             {
37                 if(i == 0 || p[i].x != p[i-1].x)
38                 {    //这是一条新的竖线
39                     ++k;
40                     on[k] = on2[k] = 0;
41                     left[k] = k == 0 ? 0 : left[k-1] + on2[k-1] - on[k-1];
42                 }
43                 if(p[i].y > ymin && p[i].y < ymax)
44                     ++on[k];
45                 if(p[i].y >= ymin && p[i].y <= ymax)
46                     ++on2[k];
47             }
48             if(k <= 2)
49                 return n;
50
51             int M = 0;
52             for(int j = 1; j <= k; ++j)
53             {
54                 ans = max(ans, left[j] + on2[j] + M);
55                 M = max(M, on[j] - left[j]);
56             }
57         }
58
59     return ans;
60 }
61
62 int main(void)
63 {
64     #ifdef LOCAL
65         freopen("3695in.txt", "r", stdin);
66     #endif
67
68     int kase = 0;
69     while(scanf("%d", &n) == 1 && n)
70     {
71         for(int i = 0; i < n; ++i)
72         {
73             scanf("%d%d", &p[i].x, &p[i].y);
74             y[i] = p[i].y;
75         }
76         printf("Case %d: %d\n", ++kase, solve());
77     }
78     return 0;
79 }

代码君

小结:大白书上面的题感觉思路之奇妙,仔细琢磨也不能百分百领会其精髓。一定是我等弱渣太弱了,做题太少了。

LA 3695 Distant Galaxy

时间: 2024-10-29 19:11:37

LA 3695 Distant Galaxy的相关文章

UVA - 1382 Distant Galaxy

题目大意:给出 n 个点,问说一个平行与 x 轴和 y 轴的矩形,最多能有多少个点落在边上. 解题思路:首先先将 y 轴相同的放在一起,然后枚举左右边界,考虑上下边界,维护最大值 #include <cstdio> #include <algorithm> using namespace std; struct Point { int x; int y; bool operator < (const Point& a) const { return x < a.

【poj3141】 Distant Galaxy

http://poj.org/problem?id=3141 (题目链接) 题意:给出平面上n个点,找出一个矩形,使边界上包含尽量多的点. solution  不难发现,除非所有输入点都在同一行或同一列上,最优矩形的4条边上都至少有一个点.这样的话,我们可以枚举四条边穿过的点,然后统计点数.  考虑部分枚举,只枚举矩形上下界,用其它方法确定左右界.  设一条竖线i,用left[i]表示竖线左边位于上下界上单点数(不统计位于该竖线上的点),on[i]和on2[i]表示竖线上位于上下边界之间的点数(

LA3695 Distant Galaxy

对于这种题真的是一点想法都没有,根本不知道从哪里下手... 还是大白上的题(P52),有详解. 书上说的枚举上下边界是指求出总共有多少种不同的纵坐标的值,因为题目中给出的坐标都是整数,每个纵坐标值都可以做为一个边界,这样就只有有限的组合. 还有一开始很困惑的地方就是,为什么求出的矩形都是特殊的矩形----与坐标轴平行的.值得仔细想想 #include <cstdio> #include <cstring> #include <algorithm> using names

LA 3695 部分枚举

运用部分枚举的思想,很明显完全枚举点的思想是不可能的.改为枚举上下边界,当确定右边界j后,对左边界i,可以有点数为on[j]+on[i]+(leftu[j]-leftu[i])+leftd[j]-leftd[i].然后取最大值,on[j]+on[i]+(leftu[j]-leftu[i])+leftd[j]-leftd[i]=(on[j]+leftu[j]+leftd[j])+on[i]-leftu[i]-leftd[i].维护on[i]-leftu[i]-leftd[i]的最大值.leftu为

UVA - 1312 Cricket Field 构造

题目大意:在一个W * H的网格中有n棵树,要求你在这个网格中找出最大个的一个正方形,这个正方形内部不能有树,边上可以有树 解题思路:刚开始以为要暴力枚举每一个点,结果发现错了,其实这题就像UVA - 1382 Distant Galaxy这题一样,只不过这个是要找正方形,找正方形和找矩形类似,只需要取矩形的最小边就可以了 #include<cstdio> #include<algorithm> using namespace std; #define maxn 110 struc

简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea

题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /************************************************ * Author :Running_Time * Created Time :2015/11/10 星期二 14:16:17 * File Name :LA_3890.cpp ********************

LA 3890 (半平面交) Most Distant Point from the Sea

题意: 给出一个凸n边形,求多边形内部一点使得该点到边的最小距离最大. 分析: 最小值最大可以用二分. 多边形每条边的左边是一个半平面,将这n个半平面向左移动距离x,则将这个凸多边形缩小了.如果这n个半平面交非空,则存在这样距离为x的点,反之则不存在. 半平面交的代码还没有完全理解. 和凸包类似,先对这些半平面进行极角排序.每次新加入的平面可能让队尾的平面变得“无用”,从而需要删除.由于极角序是环形的,所以也可能让队首元素变得“无用”.所以用双端队列来维护. 1 //#define LOCAL

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

HDU 5073 Galaxy (数学)

Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 4991    Accepted Submission(s): 1215Special Judge Problem Description Good news for us: to release the financial pressure, the government