UVA - 1312 Cricket Field 构造

题目大意:在一个W * H的网格中有n棵树,要求你在这个网格中找出最大个的一个正方形,这个正方形内部不能有树,边上可以有树

解题思路:刚开始以为要暴力枚举每一个点,结果发现错了,其实这题就像UVA - 1382 Distant Galaxy这题一样,只不过这个是要找正方形,找正方形和找矩形类似,只需要取矩形的最小边就可以了

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 110

struct Point{
    int x, y;
}p[maxn];
int n, W, H, y[maxn];

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

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);
        y[i] = p[i].y;
    }
    y[n] = 0, y[n + 1] = H;
    sort(y, y + n + 2);
    sort(p, p + n, cmp);
}

void solve() {
    int ans = 0, xx, yy;
    int m = unique(y, y + n + 2) - y;
    for(int i = 0; i < m; i++)
        for(int j = i + 1; j < m; j++) {
            int h = y[j] - y[i], pre = 0, w;
            for(int k = 0; k < n; k++) {
                if(p[k].y <= y[i] || p[k].y >= y[j])
                    continue;
                w = p[k].x - pre;
                if(ans < min(w, h)) {
                    ans = min(w,h);
                    xx = pre;
                    yy = y[i];
                }
                pre = p[k].x;
            }
            w = W - pre;
            if(ans < min(h, w)) {
                ans = min(h,w);
                xx = pre;
                yy = y[i];
            }
        }
    printf("%d %d %d\n",xx, yy, ans);
}

int main() {
    int test;
    scanf("%d", &test);
    while(test--) {
        init();
        solve();
        if(test)
            printf("\n");
    }
    return 0;
}
时间: 2024-10-11 15:41:47

UVA - 1312 Cricket Field 构造的相关文章

UVA 1312 Cricket Field

题意: 在w*h的坐标上给n个点, 然后求一个最大的矩形,使得这个矩形内(不包括边界)没有点,注意边界上是可以有点的. 分析: 把坐标离散化.通过两重循环求矩形的高,然后枚举,看是否能找到对应的矩形. 代码: #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int

UVa 1312 Cricket Field (枚举+离散化)

题意:在w*h的图上有n个点,要求找出一个正方形面积最大,且没有点落在该正方形内部. 析:枚举所有的y坐标,去查找最大矩形,不断更新. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <

1312 - Cricket Field

该题的网格大小非常大,看似需要离散化,但是实际上是不需要的 .  因为我们可以发现,既然要求正方形里没有树,我们不妨直接枚举树就可以了 . 所以我们将纵坐标单独拿出来从小到大排序,二重循环就可以枚举出矩形上下界,然后关键是横坐标的枚举. 同样,我们将横坐标排序,然后判断对应的纵坐标是否在上下界范围内,通过观察,如果不在,那么这个点将不在当前枚举的矩形中,所以直接跳过就可以了,这样的话,我们只需要一个变量来动态维护左边界就可以了 . 细节 参见代码: #include<bits/stdc++.h>

UVA 10458 - Cricket Ranking(容斥原理)

UVA 10458 - Cricket Ranking 题目链接 题意:给定k个区间,要求用这些数字范围去组合成n,问有几种组合方式 思路:容斥原理,容斥是这样做:已知n个组成s,不限值个数的话,用隔板法求出情况为C(s + n - 1, n - 1),但是这部分包含了超过了,那么就利用二进制枚举出哪些是超过的,实现把s减去f(i) + 1这样就保证这个位置是超过的,减去这部分后,有多减的在加回来,这就满足了容斥原理的公式,个数为奇数的时候减去,偶数的时候加回 代码: #include <cst

uva 10458 - Cricket Ranking(容斥+高精度)

题目连接:uva 10458 - Cricket Ranking 题目大意:给定k和n,表示有k个比赛,总共要的n分,每个比赛可以得l~r的分数,问说可以有多少种得分方式. 解题思路:容斥,可以参考Codeforces 451E. #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int MAXN = 1005

Codeforces Gym 100002 C &quot;Cricket Field&quot; 暴力

"Cricket Field" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100002 Description Once upon a time there was a greedy King who ordered his chief Architect to build a field for royal cricket inside his park. The King was so

uva 269 - Counting Patterns(构造)

题目链接:uva 269 - Counting Patterns 题目大意:给出n和k,要求找出满足的序列,要求为n元组,由-k到k组成,并且和为0.求出所有满足的元组个数,并且对于左移,右移,水平翻转,每个元素取相反数相同的视为一种,用字典序最大的表示,输出按照字典序最小的输出. 解题思路:因为表示的时候按照字典序最大的表示,一开始枚举开头的位置,那么在后面的数的绝对值就不会大于该数.最后判断一下,如果该序列不是最优的表示方法,就不是该情况. #include <cstdio> #inclu

【uva 1312】Cricket Field(算法效率--技巧枚举)

题意:一个 L*R 的网格里有 N 棵树,要求找一个最大空正方形并输出其左下角坐标和长.(1≤L,R≤10000, 0≤N≤100) 解法:枚举空正方形也就是枚举空矩阵,先要固定一个边,才好继续操作.(P.S.许多类型的题都是这样:先固定一个变量,再比较另外的变量.这种思想在贪心.DP等都常出现,一定要掌握!)所以这题就是先枚举一条边的范围(横坐标),再枚举排序后的点,根据当前枚举的点和之前纵坐标最大的点的纵坐标得到这条边的长度,再比较.更新答案. P.S.我这题打了2个小时!??º·(? ??

UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排序,后来知道是,可是还是不会写. 既然要拼成无限大,那么只要拼的时候拼出一个环来,又由于每个是无限多的,那么可以一直重复, 就能拼起来无限大的东西,把每个正方形看成一条边,那么不就是一个拓扑排序,看看能不能找到一个环么, 如果能找到,那么就可以,找不到,就不可以.注意的是正方形可以从四面都拼,所以要