洛谷P1378油滴扩展
题目描述
在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。
必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)
注:圆的面积公式V=pi*r*r,其中r为圆的半径.
输入输出格式
输入格式:
第1行一个整数N。
第2行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。
接下去N行,每行两个整数xi,yi,表示盒子的N个点的坐标。
以上所有的数据都在[-1000,1000]内。
输出格式:
一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)
输入样例#1:
输入:
2
20 0 10 10
13 3
17 7
输出:
50
分析:
这题一看搜索啊,再一看又是圆又是矩形的,还要考虑面积,当时我就想哇这题好难好难啊,然后在dalao的讲解并带嘲讽发现这题真的还不难.就是处理的地方有些麻烦
先讲讲题意吧
1.我们已知一个矩阵.
2.已知在矩阵里我们有n个坐标,这些坐标代表的是这n个油滴的坐标由题目已知这n个油滴可以随意扩展直到碰到矩形边界或碰到另一个油滴
且当一个油滴的坐标被另一个油滴覆盖那么这个油滴是不合法的即这个油滴能扩展的面积为0.
3.我们需要求出在所有的油滴扩展完毕后矩阵剩下的面积最小.
条件及面积的处理
因为题目要求求出最小的剩下面积即我们需要求出这个圆能扩展的最大半径.
圆的半径处理
我们可以一个圆在矩阵里能取得最大半径即是这个圆心离这个矩阵四边中最小的距离,这是第一步,接下来因为有其他油滴的存在所以油滴能取得最大半径还要被其他油滴限制
怎么找出它能取得最大半径?简单的画个图就能明白一个圆的在被其他圆限制的条件下它能取得最大半径就是这两个圆之间的欧几里得距离在减去另一个圆的半径
更明确一点.
1.先找到这个圆在矩形中能取的最大半径.
int len1=min(abs(xa-x[k]),abs(xb-x[k]));//这里xa,xb,ya,yb为矩阵的对角点坐标
int len2=min(abs(ya-y[k]),abs(yb-y[k]));//因为坐标可能存在负数的情况所以要abs
double r1=min(len1,len2);//取最小
2.在其他油滴约束下能取得最大半径
for(int i=;i<=n;i++)
{
if(vis[i]&&k!=i)//k为当前这个油滴的编号即第几个油滴//这里k!=i当然自己不能和自己比较//vis[i]能比较当然是在我们放有油滴的情况下
{
r1=min(r1,dis(x[i],x[k],y[i],y[k])-r[i]);//dis是我声明的求欧几里得距离的函数r[i]半径这个半径是和我们比较的那个圆的半径这里取min值是和上面的r1取最小至于为什么我在上面说的很清楚了
}
}
3.注意
因为题目说了如果当前这个油滴的坐标被其他油滴覆盖的话那这个油滴它不能扩展即我们将它的半径变为0
for(int i=;i<=n;i++)//所以这里我们需要枚举这n个所有油滴的坐标来判断
{
if(vis[i]&&k!=i)//这里vis,k和上面的是一样的用处
{
if(r[i]>dis(x[i],x[k],y[i],y[k]))//这个地方很容易明白如果这两个点之间的欧几里得距离小于我们要比较的这个圆的半径说明这个圆就被覆盖了
return ;我们返回它的半径为0
}
}
剩下的就没什么可讲的贴代码
代码:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int N=+;
const double pi=3.141592;
int n,xa,xb,ya,yb;
double x[N],y[N],keay,r[N];
bool vis[N];
double dis(int x,int x1,int y,int y1)//欧几里得
{
return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
}
double R(int k)//寻找这个圆能取得最大半径
{
for(int i=;i<=n;i++)
{
if(vis[i]&&k!=i)//不合法将它的半径变为0
{
if(r[i]>dis(x[i],x[k],y[i],y[k]))
return ;
}
}
int len1=min(abs(xa-x[k]),abs(xb-x[k]));//在矩形里能取得最大半径
int len2=min(abs(ya-y[k]),abs(yb-y[k]));
double r1=min(len1,len2);
for(int i=;i<=n;i++)
{
if(vis[i]&&k!=i)
{
r1=min(r1,dis(x[i],x[k],y[i],y[k])-r[i]);//比较在矩形里能取的最大半径和在其他圆约束下能取的最大半径
}
}
return r1;
}
void dfs(int t,double sum)
{
if(t==n)
{
keay=max(keay,sum);
return;
}
for(int i=;i<=n;i++)
{
if(!vis[i])
{
r[i]=R(i);//计算每个点能取的最大半径
vis[i]=true;
dfs(t+,sum+pi*r[i]*r[i]);
vis[i]=false;//回溯
}
}
}
int main()
{
double S;
cin>>n;
cin>>xa>>ya>>xb>>yb;
S=abs(xb-xa)*abs(yb-ya);//S为矩阵面积
for(int i=;i<=n;i++)
cin>>x[i]>>y[i];
dfs(,);
cout<<(int)(S-keay+0.5);//四舍五入
return ;
}
洛谷P1378油滴扩展的更多相关文章
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷 P1378 油滴扩展 改错
P1378 油滴扩展 题目描述 在一个长方形框子里,最多有\(N(0≤N≤6)\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油 ...
- 洛谷P1378 油滴扩展
P1378 油滴扩展 题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完 ...
- 洛谷 P1378 油滴扩展
P1378 油滴扩展 题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完 ...
- 洛谷 P1378 油滴扩展 Label:搜索
题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- P1378 油滴扩展——搜索小记
P1378 油滴扩展 记得这道题好久以前(好像是上个学期?) 就想做了,但是看着里面的半径边界好像很难处理就没做(主要是当时刚学OI(菜还给自己找借口)): 今天上午一直研究SG函数,做的都自闭了,晚 ...
- [动态规划]P1378 油滴扩展
题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...
- P1378 油滴扩展
题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...
随机推荐
- 【洛谷P2607】[ZJOI2008]骑士
骑士 题目链接 这道题一看,似乎和舞会是一样的,然而它并没有保证是一棵树 但是,对于每个连通块,必有相同的点数和边数,这样的图一定是一棵树上加一条边 这条边一定回使图中形成一个环,这种图貌似叫“基环树 ...
- 【luogu P3374 树状数组1】 模板
题目链接:https://www.luogu.org/problemnew/show/P3374 留个坑,以后补上BIT的讲解,先留下板子复习用 #include<iostream> #i ...
- spring入门(八) spring mvc设置默认首页
1.web.xml配置如下 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...
- JavaScript 基础(一)
基本语法: 区分大小写: ECMAScript 中的一切(变量,函数名和操作符)都区分大小写. 标识符: 表示符就是指,变量,函数,属性名字,或者函数的参数. 1.第一个字符必须是一个字母,下划线(_ ...
- leetcode算法之 Single Number
题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 要求: 时间复杂度O(n),空间复杂都O(1) 示例: 输入: [2,2,1] 输 ...
- 【SHOI2015】脑洞治疗仪(恶心的线段树,区间最大子段和)
题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...
- poj_1091_跳蚤
Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M ...
- Flask中异常捕获
HTTP 异常主动抛出 abort 方法 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404). 参数: cod ...
- 在Liunx Mint下无法切换到root用户
提示 su: Authentication failure 以ubuntu的mint root用户默认是也是禁止的 需要手动打开才行 a)root启用 执行下面的操作:1.先解除root锁定,为roo ...
- loushang框架的开发中关于BSP的使用,将写好的功能模块部署到主页界面结构上
前言: 当我们已经开发好相应的模块或者功能的时候,需要将这个功能部署在index主页上作为可点击直接使用的模块,而不是每次需要去浏览对应的url地址. 这时候就需要运用到L5的BSP. 作为刚刚入门l ...