hdu 3299 Distant Galaxy 策略
来源:互联网 发布:淘宝上开店在哪里进货 编辑:程序博客网 时间:2024/06/10 03:56
题意:
给定n(1<=n<=100)个点,现在要求找到一个矩阵,使得矩阵边界上包含尽可能多的点。输出最多能包含的点数。
题解:
先我们可以确定矩阵四条边界上必定至少存在一个点(除非所有点都在一条线上,这时结果是n)。那么我们可以枚举矩阵上下边界,耗时O(n^2)。然后枚举所有的竖线,耗时O(n),再在O(n)时间内找出两条竖线使得以枚举的两条线为上下边界的矩阵的最大包含点数,总复杂度O(n^3)。所以我们需要用到下面的数组:
Left[i]表示在竖线i左边,两条上下边界线上的点的个数(不包含竖线i上的点)
on[i]表示竖线i上的点且在两条上下边界间的点(不包括边界上的点)
on2[i]表示竖线i上的点且在两条上下边界间的点(包括边界上的点)
具体信息见下图。
那么矩阵上的点个数为ans=Left[j]-Left[i]+on[i]+on2[j](i<j)。我们在枚举竖线的时候,用maxv保存之前最大的on[i]-Left[i],那么就能在O(n)时间内找到两条上下边界条件下的最大的ans。
代码:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <cctype>using namespace std;const int maxn=1e2+10;struct Point{ int x,y; bool operator < (const Point &a)const{ return x<a.x; }}e[maxn];int n,m,y[maxn],on[maxn],on2[maxn],Left[maxn];int solve(){ sort(e,e+n); sort(y,y+n); m=unique(y,y+n)-y;//去重 if(m<=2)return n;//只有两种以下不同的y时,矩阵可以包含所有的点 int i,j,k,p,ans=0,maxv,ymin,ymax; for(i=0;i<m;i++) { for(j=i+1;j<m;j++)//枚举矩阵的两条横线 { ymin=y[i];ymax=y[j];//矩阵上下界很坐标 k=0; for(p=0;p<n;p++)//确定在矩阵的竖线,共k条 { if(p==0||e[p].x!=e[p-1].x) { k++; on[k]=on2[k]=0; Left[k]=k==0?0:Left[k-1]+on2[k-1]-on[k-1]; } if(e[p].y>ymin&&e[p].y<ymax)on[k]++; if(e[p].y>=ymin&&e[p].y<=ymax)on2[k]++; } if(k<=2)return n;//只有两种以下的x时,矩阵可以包含所有的点 maxv=0;//最大的on[i]-Left[i](i<p) for(p=1;p<=k;p++) { ans=max(ans,Left[p]+on2[p]+maxv); maxv=max(maxv,on[p]-Left[p]); } } } return ans;}int main(){ int tt=0; while(scanf("%d",&n)!=EOF) { if(n==0)break; int i,j,k; for(i=0;i<n;i++) { scanf("%d%d",&e[i].x,&e[i].y); y[i]=e[i].y; } printf("Case %d: %d\n",++tt,solve()); } return 0;}/*Left[i]表示在竖线i左边,两条上下边界线上的点的个数(不包含竖线i上的点)on[i]表示竖线i上的点且在两条上下边界间的点(不包括边界上的点)on2[i]表示竖线i上的点且在两条上下边界间的点(包括边界上的点)那么矩阵上的点个数为Left[j]-left[i]+on[i]+on2[j](i<j)。*/
0 0
- hdu 3299 Distant Galaxy 策略
- 【瞎搞】 HDU 3299 Distant Galaxy 枚举
- Distant Galaxy
- Distant Galaxy
- POJ-3141-Distant Galaxy
- uva 1382 - Distant Galaxy
- uva 1382 - Distant Galaxy
- POJ--3141--Distant Galaxy
- UVA - 1382 Distant Galaxy
- UVa:1382 Distant Galaxy
- UVA 1382 - Distant Galaxy
- UVA 1382 Distant Galaxy
- poj 3141Distant Galaxy
- LA3695 - Distant Galaxy
- UVA - 1382 Distant Galaxy
- poj 3141 Distant Galaxy
- Distant Galaxy(高效)
- 【poj3141】 Distant Galaxy
- POJ1365 Prime Land 初等数论
- 数据结构之图(存储结构、遍历)
- Unix:第20章 正则表达式
- springMvc3.0.5搭建全程
- 使用NSOperation和NSOperationQueue启动多线程开发应用
- hdu 3299 Distant Galaxy 策略
- 涡街流量计显示值与实际值不符的主要因素
- AC自动机
- C++之练习题38
- HBase 0.94.21 zookeeper-3.4.6 分布式安装
- 包装机与自然资源的关系
- Android UI布局如何固定底部元素
- 二分查找
- 结构体中使用string