洛谷 P2218 [HAOI2007]覆盖问题 解题报告
P2218 [HAOI2007]覆盖问题
题目描述
某人在山上种了\(N\)棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用\(3\)个\(L*L\)的正方形塑料薄膜将小树遮起来。我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为\((X_i,Y_i)\),\(3\)个\(L*L\)的正方形的边要求平行于坐标轴,一个点如果在正方形的边界上,也算作被覆盖。当然,我们希望塑料薄膜面积越小越好,即求\(L\)最小值。
输入输出格式
输入格式:
第一行有一个正整数\(N\),表示有多少棵树。
接下来有\(N\)行,第\(i+1\)行有\(2\)个整数\(X_i\),\(Y_i\),表示第\(i\)棵树的坐标,保证不会有\(2\)个树的坐标相同。
输出格式:
一行,输出最小的\(L\)值。
说明
数据范围
\(100\%\)的数据,\(-1,000,000,000<=X_i,Y_i<=1,000,000,000\)
\(30\%\)的数据,\(N<=100\)
\(50\%\)的数据,\(N<=2000\)
\(100\%\)的数据,\(N<=20000\)
一道思路自然,感觉解法非常有道理但是想不到的题目(其实是我太菜)
二分答案+贪心或枚举放正方形,一般都可以想到这里来
然后怎么放呢。。。
考虑一些看起来非常容易忽视的条件
“\(3\)个\(L*L\)的正方形的边要求平行于坐标轴”
“3个”、“平行于坐标轴”
这是两个关键词
坐标轴是相互垂直的,那么如果我们用一个矩性围住点集,我们惊奇的发现,这个矩形是唯一的。
这里可能是比较跳跃,但是多试多换思路,其实是可能想到的。
然后“3个”正方形,我们发现矩形的每条边都需要和正方形的相接,因为边上必有点需要覆盖
因为矩形有四个边,我们发现有一个正方形必须去填角。
枚举!
然后只有两个正方形,而且剩余点集构成子问题
递归求解!
因为状态数非常少,所以很显然可过
总结一下,没什么思路的时候不妨多分析分析题目条件的特殊性究竟有什么意义,哪怕没什么感觉也多试几个想法
Code:
#include <cstdio>
#include <cstring>
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
const int N=20010;
const int inf=0x3f3f3f3f;
int dx[N],dy[N],used[N],l,r,up,down,n;
void get()
{
l=down=inf,r=up=-inf;
for(int i=1;i<=n;i++)
{
if(used[i]) continue;
l=min(l,dx[i]),r=max(r,dx[i]);
down=min(down,dy[i]),up=max(up,dy[i]);
}
}
bool check(int len,int rest)
{
get();
if(rest==1) return len>=max(r-l,up-down);
int l0=l,r0=r,up0=up,down0=down,flag=0,vis[N];
for(int i=1;i<=n;i++) vis[i]=used[i];
for(int i=1;i<=n;i++)
if(dx[i]>=l0&&dy[i]<=up0&&dx[i]<=l0+len&&dy[i]>=up0-len)
used[i]=1;
flag=max(flag,check(len,rest-1));
for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]>=l0&&dy[i]>=down0&&dx[i]<=l0+len&&dy[i]<=down0+len)
used[i]=1;
flag=max(flag,check(len,rest-1));
for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]<=r0&&dy[i]<=up0&&dx[i]>=r0-len&&dy[i]>=up0-len)
used[i]=1;
flag=max(flag,check(len,rest-1));
for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]<=r0&&dy[i]>=down0&&dx[i]>=r0-len&&dy[i]<=down0+len)
used[i]=1;
flag=max(flag,check(len,rest-1));
return flag;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",dx+i,dy+i);
get();
int L=1,R=max(r-l,up-down);
while(L<R)
{
int mid=L+R>>1;
memset(used,0,sizeof(used));
if(check(mid,3))
R=mid;
else
L=mid+1;
}
printf("%d\n",L);
return 0;
}
2018.8.10
洛谷 P2218 [HAOI2007]覆盖问题 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
- 洛谷 P3965 [TJOI2013]循环格 解题报告
P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...
- 洛谷 P2765 魔术球问题 解题报告
P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...
随机推荐
- MySQL wait_timeout参数修改
MySQL wait_timeout参数修改问题,可能经常会有DBA遇到过,下面就试验一下并看看会有什么现象. wait_timeout分为global级及session级别,如未进行配置,默认值为2 ...
- 如何用Python做自动化特征工程
机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理.而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练那样能产生直接可用的结果.本文作者将使用 ...
- IT类职位常用缩写 SA SD RD PG PM DBA MIS QA Sales
身为IT民工的基本常识,IT类职位常用缩写 SA (System Analyst) 系统分析师 在软体开发团队中,属于中高阶的基层管理者与领导者.除了须具备优秀的文字.语言沟通能力之外,还要有良好的分 ...
- django的HttpResponse对象
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以.视图的第一个参数必须是HttpRequest对象,在django. ...
- rails中如何在a标签中添加其他标签
最近在用rails写一个项目练练手,然后遇到了一个问题,就是用 <% link_to("首页", root_path) %> 生成一个a标签,之后就在想我怎么在这个a标 ...
- Qt——信号与槽
自定义槽函数,槽函数可以是任何位置定义的函数(成员函数,静态函数,全局函数),但是槽函数的函数类型要和信号的函数类型一致.
- Go语言中的HTTP
Go中的http使用 package main import ( "fmt" "net/http" "io/ioutil" "st ...
- hoj第三场G-manhattanp ositioning system
---恢复内容开始--- 一.题意 在二维坐标系内,给定若干个点和目标点距离该点的曼哈顿距离,求是否存在唯一解使得目标点坐标为整数. 二.题解 重新思考题目模型,考虑曼哈顿距离一定时,几何含义为,以给 ...
- 11 TCP实现QQ聊天
1.客户端参考代码 #coding=utf-8 from socket import * # 创建socket tcpClientSocket = socket(AF_INET, SOCK_STREA ...
- nginx+tomcat 反向代理 负载均衡配置
1.nginx的安装和配置见:http://www.cnblogs.com/ll409546297/p/6795362.html 2.tomcat部署项目到对应的服务器上面并启动,不详解 3.在ngi ...