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>
分析:确保最大值,上下枚举,左右扫描, #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>
相关文章推荐
- ListView优化方案
- 手机开发实战74——Internet的接入方式
- C/C++的前世今生
- PE结构详解
- 手机开发实战73——DNS介绍
- PHP的会话处理函数session
- sql server 修改表名
- 这次考试,获益良多。
- arduino程序编译和上传
- 手机开发实战72——域名介绍
- OJ题 1019 逆输出
- android中的键值对
- mybatis中mapper的扩展
- 手机开发实战71——IP地址介绍
- 手机开发实战70——网址介绍
- boundingRectWithSize 的使用,计算Label高度
- 自定义控件之一:自定义属性
- 机房收费系统总结篇(二)
- 实战自动化测试Espresso和Ui automator(一)
- 欢迎使用CSDN-markdown编辑器