您的位置:首页 > 其它

uva 1312 - Cricket Field(枚举+离散化)

2014-02-13 22:03 609 查看
题目链接:uva 1312 - Cricket Field

题目大意:在w*h的图上有n个点,要求找出一个正方形面积最大,且没有点落在该正方形内部。

解题思路:枚举y坐标,每次遍历所有点,判断是否有点落在矩形内,有的话维护最优解,更新下线。

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int N = 105;

struct point {
int x, y;
}p
;
int n, w, h, dy
;

bool cmp(const point& a, const point& b) {
if (a.x != b.x) return a.x < b.x;
return a.y < b.y;
}

void init() {
scanf("%d%d%d", &n, &w, &h);
for (int i = 0; i < n; i++) {
scanf("%d%d", &p[i].x, &p[i].y);
dy[i] = p[i].y;
}
dy
= 0; dy[n+1] = h;
sort(dy, dy + n + 2);
sort(p, p + n, cmp);
}

void solve () {
int ansx, ansy, ans = 0;
int m = unique(dy, dy + n + 2) - dy;
for (int i = 0; i < m; i++) {
for (int j = i + 1; j < m; j++) {
int maxy = dy[j], miny = dy[i];
int hh = maxy - miny, ww = 0, tmp = 0;
for (int k = 0; k < n; k++) {
if (p[k].y <= miny || p[k].y >= maxy) continue;
ww = p[k].x - tmp;
if (ans < min(ww, hh)) {
ans = min(ww, hh);
ansx = tmp; ansy = miny;
}

tmp = p[k].x;
}

ww = w - tmp;
if (ans < min(ww, hh)) {
ans = min(ww, hh);
ansx = tmp; ansy = miny;
}
}
}
printf("%d %d %d\n", ansx, ansy, ans);
}

int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
if (cas) printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: