关于"覆盖问题”的反思
[HAOI2007]覆盖问题
题目描述
某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定 用3个L*L的正方形塑料薄膜将小树遮起来。我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*L的正方形的边要求平行 与坐标轴,一个点如果在正方形的边界上,也算作被覆盖。当然,我们希望塑料薄膜面积越小越好,即求L最小值。
输入格式
第一行有一个正整数N,表示有多少棵树。
接下来有N行,第i+1行有2个整数Xi,Yi,表示第i棵树的坐标,保证不会有2个树的坐标相同。
输出格式
一行,输出最小的L值。
样例 #1
样例输入 #1
4
0 1
0 -1
1 0
-1 0
样例输出 #1
1
提示
数据范围
100%的数据,-1,000,000,000<=Xi,Yi<=1,000,000,000
30%的数据,N<=100
50%的数据,N<=2000
100%的数据,N<=20000
我一直困扰自己的错误思路:

一定会有一个点在角上,另外两个点紧挨边
实际上的正确想法是,

在铺好一块塑料布之后,删去已经铺好的点,剩下的点仍然是无序的,也就是第二三块与第一块的情况是相同的。
判断的式子也是相同的,不存在紧挨着边之类的问题。
另外,范围只有$ 20000 $,可以尝试一些复杂度较高的暴力。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int x[20010],y[20010];
int n;
int v[20010];
bool check(int l,int c)
{
int xi=INT_MAX,xa=INT_MIN,yi=INT_MAX,ya=INT_MIN;
for(int i=1;i<=n;i++)
if(!v[i])
{
xi=min(xi,x[i]);
xa=max(xa,x[i]);
yi=min(yi,y[i]);
ya=max(ya,y[i]);
}
bool ll=1;
for(int i=1;i<=n;i++)
if(!v[i])
{
if(x[i]>=xi&&x[i]<=xi+l&&y[i]>=yi&&y[i]<=yi+l)
v[i]=c;
else
{
ll=0;
}
}
if(c!=3) ll=check(l,c+1);
for(int i=1;i<=n;i++)
if(v[i]==c)
v[i]=0;
if(ll) return 1;
ll=1;
for(int i=1;i<=n;i++)
if(!v[i])
if(x[i]>=xi&&x[i]<=xi+l&&y[i]>=ya-l&&y[i]<=ya)
v[i]=c;
else
ll=0;
if(c!=3) ll=check(l,c+1);
for(int i=1;i<=n;i++)
if(v[i]==c)
v[i]=0;
if(ll) return 1;
ll=1;
for(int i=1;i<=n;i++)
if(!v[i])
if(x[i]>=xa-l&&x[i]<=xa&&y[i]>=yi&&y[i]<=yi+l)
v[i]=c;
else
ll=0;
if(c!=3) ll=check(l,c+1);
for(int i=1;i<=n;i++)
if(v[i]==c)
v[i]=0;
if(ll) return 1;
ll=1;
for(int i=1;i<=n;i++)
if(!v[i])
{
if(x[i]>=xa-l&&x[i]<=xa&&y[i]>=ya-l&&y[i]<=ya)
v[i]=c;
else
{
ll=0;
}
}
if(c!=3) ll=check(l,c+1);
for(int i=1;i<=n;i++)
if(v[i]==c)
v[i]=0;
if(ll) return 1;
for(int i=1;i<=n;i++)
if(v[i]==c)
v[i]=0;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
memset(v,0,sizeof(v));
int l=1,r=INT_MAX-3;
while(l<r)
{
memset(v,0,sizeof(v));
int mid=(l+r)/2;
if(check(mid,1)) r=mid;
else l=mid+1;
}
printf("%d",l);
return 0;
}
/*
5
2 2
3 5
6 -3
-2 -2
-3 6
*/
关于"覆盖问题”的反思的更多相关文章
- poj 3417 Network 题解
题意: 先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通. 思路: 从原边的角度看 1.树加边,一定成环,加一条(u,v)边就有u-& ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
- 关于git pull时出现的问题及解决反思
前因 在前面由于已经git过一次,按照娄老师的要求,代码一个一个commit,所以删掉之前的git仓库(用la查看,使用rm -rf .git删除).但远程origin已经存在,所以执行git rem ...
- [考试反思]0801NOIP模拟测试11
8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...
- 【NHOI2018】黑格覆盖
[题目描述] 在一张由 M * N 个小正方形格子组成的矩形纸张上,有 k 个格子被涂成了黑色.给你一张由 m * n 个同样小正方形组成的矩形卡片,请问该卡片最多能一次性覆盖多少个黑格子? [输入数 ...
- 【集训Day3 离散化】矩形覆盖
矩形覆盖(planting) [问题描述] 给定在一个平面坐标系上的N(1 <= N <= 100)个矩形区域,这N个矩形可能有相互覆盖的部分.求平面上被所有矩形覆盖的总面积,重复部分只算 ...
- 记一次构建SaaS平台项目失败后的反思(收集的客户需求太少,且没有区分重点,闭门造车。技术演变要渐进)
记一次构建SaaS平台项目失败后的反思 前言: 笔者从2017年起开始着手将公司现有的软件系统改造成多租户模式,以降低整个系统的运营成本.但最后这个项目以失败告终.今天,我将对这个SaaS项目是如何走 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 【2020.12.02提高组模拟】A组反思
55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...
- JZOJ 11.28 提高B组反思
JZOJ 11.28 提高B组反思 被打崩了呀 下次打提高A去了(逃 T1 刚开始没有读懂题,后来读懂了以后没有思路.没有想到是一个构造题,对同构的性质没有了解清楚,题解也讲的不明不白,懵-- T2 ...
随机推荐
- Python 函数返回值及传递列表
函数返回值 函数并非总是直接显示输出,它可以处理一些数据,并返回一个或一组值,函数返回的值被称为返回值. 使用return语句将值返回到调用函数的代码行中 # 返回简单值 def get_format ...
- 【H5】Emmet 指令 HTML
Emmet操作指南 HTML篇 生成带有内容的标签 标签名{内容}可以生成带有内容的标签 div{abc} <div>abc</div> 生成带有属性的标签 生成带有class ...
- sourcetree和git无法识别新增文件
在工程中新建文件,但是git和sourcetree无法识别,我是用的是Xcode添加的文件和图片,全都无法识别.例如,新建一个类文件,.h和.m都是别不出来,但是工程文件显示已经添加相对应的类,所以肯 ...
- 2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,也就是可以用B中的任何商品替换A中的任何
2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,也就是可以用B中的任何商品替换A中的任何 ...
- 2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的。返回其长度。
2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的.返回其长度. 福大大 答案2021-03-23: 双指 ...
- 2021-05-05:一个数组中只有两种字符‘G‘和‘B‘,可以让所有的G都放在左侧,所有的B都放在右侧。或者可以让所有的G都放在右侧,所有的B都放在左侧。但是只能在相邻字符之间进行交换操作。返回至少
2021-05-05:一个数组中只有两种字符'G'和'B',可以让所有的G都放在左侧,所有的B都放在右侧.或者可以让所有的G都放在右侧,所有的B都放在左侧.但是只能在相邻字符之间进行交换操作.返回至少 ...
- 【从0开始编写webserver·基础篇#02】服务器的核心---I/O处理单元和任务类
I/O处理单元和任务类 前面写了线程池,那么现在要考虑如何去使用该线程池了 注意,到目前为止,我们还是在解决web服务器的I/O处理单元 即负责处理客户连接,读写网络数据的部分 线程池属于 Web 服 ...
- ps vs top:CPU占用率统计的两种不同方式
如何计算 CPU 占用率? 简单来说,进程的 CPU 占用率指的是 CPU 有多少时间花费在了运行进程上.在 Linux 系统里,进程运行的时间是以jiffies[1]统计的,通过计算jiffies ...
- drf——5个视图扩展类、9个视图子类、视图集、drf之路由
5个视图扩展类 # 写5个类(不叫视图类 视图拓展类 需要配合GenericAPIView一起用) 每个类有一个方法 以后想写哪个接口 就继承哪个类即可 from rest_framework.res ...
- XTTS测试遇到问题:ORA-20001、ORA-06512
现场测试工程师在半夜电话反馈:在新建的小测试库做XTTS流程验证,遇到错误: ERROR at line 1: ORA-20001: TABLESPACE(S) IS READONLY OR, OFF ...