您的位置:首页 > 其它

uva 1382 Distant Galaxy (枚举&&扫描&&贪心dp)

2016-06-04 20:30 411 查看
题目大意:给出n个点,问说一个平行与x轴和y轴的矩形,最多能有多少个点落在边上。

分析:确保最大值,上下枚举,左右扫描,  #include<cstdio>
#include <iostream>
#include <cstring>
#include<algorithm>
//#define T
using namespace std;

int n, y[1005],num1[1005], num2[1005], L[1005];
struct point
{
int x, y;
};
bool cmp(point a, point b)
{
return a.x < b.x;
}
point p[1005];
int solve()
{
#ifdef T
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // T

int ans = 0;
sort(p, p + n, cmp);
sort(y, y + n);
int m = unique(y, y + n) - y;
if(m <= 2) return n;
for(int a = 0; a < m; a++)
for(int b = a + 1; b < m; b++)
{
int miny = y[a], maxy = y[b], k = 0;
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
memset(L, 0, sizeof(L));
for(int i = 0; i < n; i++)
{
if(!i || p[i].x != p[i-1].x)
{
k++;
if(k > 1) L[k] = L[k - 1] + num2[k - 1] -num1[k - 1];
}
if(p[i].y < maxy && p[i].y > miny)num1[k]++;
if(p[i].y <= maxy && p[i].y >= miny) num2[k]++;
}
if(k <= 2) return n;
int Max = 0;
for(int i = 1; i <= k; i++)
{
ans = max(ans, L[i] + num2[i] + Max);
Max = max(Max,num1[i] - L[i]);
}
}
return ans;
}
int main()
{
int Case = 1;
while(scanf("%d", &n) && 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", Case++, solve());
}
return 0;


<p>}</p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: