가장 큰 하위 사각형 문제

갱스터 블로그 설명하는
P1578 소 목욕
제목 설명
인해 존, 소 농장 울타리를 구축 급격히 우유 생산 젖소의 분노를 불러 일으켰다. 소 비위를하기 위해, 요한은 욕조에 큰 가축 농장을 구축하기로 결정했다. 그러나 요한의 소 이상한 습관, 각 소는 가축의 우유 생산에 고정 된 위치해야합니다, 그리고 젖소의 우유 목욕 명확하지 않다, 다음, 요한에 의해 만들어 희망의 화장실은 이러한 점 우유에는 적용되지 않습니다 . 이 시간, 그는 Clevow에 의존한다. 또한 Clevow을 도와 드릴까요?

화장실 소와 요한은 사각형을 계획하고있다. 욕조에 완전히 농장 내에서, 그리고 가축의 윤곽과 목욕이나 윤곽 일치 평행. 화장실 우유는 점을 포함 할 수 있지만, 윤곽 점 우유 화장실에있을 수 있습니다.

당신의 작업은 그녀가 화장실의 최대 면적을 계산하는 것입니다 때문에 Clevow 확실히 가능한 대형으로 목욕 영역을 바랍니다.

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 +7;
typedef long long ll;
struct node {
    int x, y;
    bool operator < (node& a) const {
        if(x == a.x) return y < a.y;
        return x < a.x;
    }
}p[maxn];
bool cmp(node a, node b) {
    if(a.y == b.y) return a.x < b.x;
    return a.y < b.y;
}
int main()
{
    int L, W, n;
    scanf("%d%d%d", &L, &W, &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].x, &p[i].y);
    p[++n].x = 0, p[n].y = 0;
    p[++n].x = L, p[n].y = 0;
    p[++n].x = 0, p[n].y = W;
    p[++n].x = L, p[n].y = W;
    sort(p + 1, p + 1 + n);
    int ans = 0;
    for (int i = 1; i <= n; i++) {//从左向右扫
        int h = W, l = 0;
        for (int j = i + 1; j <= n; j++) {
            ans = max(ans, (p[j].x - p[i].x) * (h - l));
            if(p[j].y < p[i].y) l = max(l, p[j].y);
            else h = min(h, p[j].y);
        }
    }
    for (int i = n; i >= 1; i--) {//从右向左扫
        int h = W, l = 0;
        for (int j = i - 1; j >= 1; j--) {
            ans = max(ans, (p[i].x - p[j].x) * (h - l));
            if(p[j].y < p[i].y) l = max(l, p[j].y);
            else h = min(h, p[j].y);
        }
    }
    sort(p + 1, p + 1 + n, cmp);//枚举遗漏的情况
    for (int i = 1; i <= n - 1; i++) ans = max(ans, (p[i + 1].y - p[i].y) * L);
    printf("%d\n", ans);
    return 0;
}

게시 25 개 원래 기사 · 원 찬양 2 · 조회수 268

추천

출처blog.csdn.net/D_Bamboo_/article/details/104072705