1312 - Cricket Field

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

细节 参见代码:

#include<bits/stdc++.h>
using namespace std;
int T,n,w,h,y[105],len;
struct point{
    int x,y;
}a[105];
bool cmp(point a,point b) {
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}
void solve() {
    sort(a,a+n,cmp);
    sort(y,y+n+2);
    len = unique(y,y+n+2) - y; //只是减少一点复杂度
    int ansx,ansy,ans = -1,hh,ww;
    for(int i=0;i<len;i++) {
        for(int j=i+1;j<len;j++) {
            hh = y[j] - y[i]; //矩形的高度
            int cur_x = 0;
            for(int k=0;k<n;k++) {
                if((a[k].y <= y[i] || a[k].y >= y[j])) continue;
                ww = a[k].x - cur_x; //矩形的宽度
                ww = min(ww,hh); //取最大正方形
                if(ans < ww) {
                    ansx = cur_x; ansy = y[i]; ans = ww;
                }
                cur_x = a[k].x;
            }
            ww = w - cur_x;
            ww = min(ww,hh);
            if(ans < ww) {
                ansx = cur_x; ansy = y[i]; ans = ww;
            }
        }
    }
    printf("%d %d %d\n",ansx,ansy,ans);
    if(T) printf("\n");
}
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d%d",&n,&w,&h);
        for(int i=0;i<n;i++) { scanf("%d%d",&a[i].x,&a[i].y); y[i] = a[i].y; }
        y[n] = 0; y[n+1] = h; //添加边界值,重复也没有关系,还要去重
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 09:36:34

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 <

UVA - 1312 Cricket Field 构造

题目大意:在一个W * H的网格中有n棵树,要求你在这个网格中找出最大个的一个正方形,这个正方形内部不能有树,边上可以有树 解题思路:刚开始以为要暴力枚举每一个点,结果发现错了,其实这题就像UVA - 1382 Distant Galaxy这题一样,只不过这个是要找正方形,找正方形和找矩形类似,只需要取矩形的最小边就可以了 #include<cstdio> #include<algorithm> using namespace std; #define maxn 110 struc

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 1312】Cricket Field(算法效率--技巧枚举)

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

redmine computed custom field formula tips

项目中要用到Computed custom field插件,公式不知道怎么写,查了些资料,记录在这里. 1.http://apidock.com/ruby/Time/strftime 查看ruby的字符串格式,用于改写Date/time format只显示日期,不显示时间. 2.https://github.com/annikoff/redmine_plugin_computed_custom_field/issues/34 看到formula里可以写复杂代码,比如增加变量.指定返回值等. 3.

lucene中Field.Index,Field.Store的一些设置

lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED)); Field有两个属性可选:存储和索引. 通过存储属性你可以控制是否对这个Field进行存储: 通过索引属性你可以控制是否对该Field进行索引. 事实上对这两个属性的正确组合很重要. Field.Index Field.Store 说明 TOKENIZED(分词) YES 被分词索引且存储 TOKE

错误号:1364 错误信息:Field &#39;platId&#39; doesn&#39;t have a default value

1. 错误描述 错误号:1364 错误信息:Field 'platId' doesn't have a default value insert into `use`.`t_platform_scale` () values () 2.错误原因 由于在建表时,给platId一个not null限制,而且没有给默认值,在插入数据时未插入,导致报错 3.解决办法 (1)修改platId可以为null (2)插入数据时一定要插入platId 版权声明:本文为博主原创文章,未经博主允许不得转载. 错误号

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam