luogu cogs 油滴扩展

1076. [NOIP2010冲刺六] 油滴扩展

★   输入文件:oilbox.in   输出文件:oilbox.out   简单对比

时间限制:1 s  
内存限制:128 MB

【题目描述】

在一个长方形框子里,最多有N(O≤N≤6)个相异的点。在其中任何一个点上放一个很小的油滴(即半径可视为0),那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合)

【输入格式】

第一行一个整数N。

第二行为长方形边框一个顶点及其对角顶点的坐标,x,y,x‘,y’。

接下去N行,每行两个整数Xi,yi,表示盒子内N个点的坐标。

以上所有的整数都在[-1000,1000]内。

【输出格式】

一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)。

【样例输入】

2

0 0 10 10

3 3

7 7

【样例输出】

50

【提示】

注:圆的面积公式S=pi*r*r,其中r为圆的半径,pi=3.1415926。

 1 #include<cmath>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstdio>
 5 using namespace std;
 6 int n,xa,ya,xb,yb;
 7 const double infd=100000000.0;//这个是对于double的INF
 8 const double PI=acos(-1);//为了精度
 9 double ans;
10 int x[10],y[10];
11 double r[10];
12 int seq[10];
13 int fact[10]={0,1,2,6,24,120,720};//阶乘值,其实就是全排列数
14 double dist(int a,int b){//求两圆a,b的圆心距
15     return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
16 }
17 void solve(){
18     double cur;//current answer目前的答案
19     cur=abs(xa-xb)*abs(ya-yb);//刚开始还没被油滴覆盖,所以是整个盒子面积
20     for(int i=0;i<n;i++){//对填充序列中的每个圆计算其在此情况下的半径
21         double mr=infd;//当前圆的半径的最大值max radian(mr)
22         mr=min(min(abs(x[seq[i]]-xa),abs(x[seq[i]]-xb)),min(abs(y[seq[i]]-ya),abs(y[seq[i]]-yb)));
23         //以上该行只考虑了盒子边界,未考虑其他之前填好的圆
24         for(int j=0;j<i;j++){//现在考察之前扩展完毕的油滴
25             double t=dist(seq[i],seq[j])-r[seq[j]];
26             //圆心距减去该圆半径,有可能有负数,此时本圆被包含在之前的圆中,需要特判,否则WA,60分
27             mr=mr<max(t,(double)0)?mr:max(t,(double)0);//特判。三思而后提交!consider twice before you submit!
28         }
29         r[seq[i]]=mr;//记录该圆半径
30         cur-=PI*mr*mr;//计算目前未被覆盖的面积
31     }
32     ans=min(ans,cur);//更新答案
33     return;
34 }
35 int main(){
36     freopen("oilbox.in","r",stdin);
37     freopen("oilbox.out","w",stdout);
38     cin>>n>>xa>>ya>>xb>>yb;
39     ans=abs(xa-xb)*abs(ya-yb);//初始化
40     for(int i=0;i<n;i++){
41         seq[i]=i;
42         cin>>x[i]>>y[i];
43     }
44     for(int i=0;i<fact[n];i++){
45         solve();
46         next_permutation(seq,seq+n);//求下一个排列
47     }
48     printf("%.0lf",ans);
49     return 0;
50 }
时间: 2024-10-11 04:38:41

luogu cogs 油滴扩展的相关文章

Luogu [P1378] 油滴扩展

首先,原题在这 恩,让我们进入正题:油滴扩展——显然,这道题是个搜索题,并且是个打眼一看上去就比较恶心的搜索题. 但是,这道题细节恶心,并不代表这道题思路难. 题意大家都了解了,让我们先来把细节问题坑点解决: 1.坐标范围为[-1000,1000],有负数怎么办? 解决方法很简单粗暴:将所有坐标加上1000就行了,然后就可视为所有坐标都为正数了. 2.让输出的答案为剩余的面积,还要四舍五入. 解决方法也很简单:先搜索求出最大覆盖面积,然后将答案 + = 0.5 ,用矩形总面积减去答案输出即可.

1378 油滴扩展

难度:普及+/提高 题目类型:搜索 提交次数:2 涉及知识:深搜 题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴.那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合) 注:圆的面积公式V=pi*r*r,其中r为圆的半径. 输入输出格式 输入格式: 第1行一个整数N. 第2行为长方形边框

[洛谷P1378]油滴扩展

题目大意:有n滴油在一个平面上,油滴按顺序依次扩展(呈圆形),当碰到其他油滴或平面边界时停止扩展,让你设计一个扩展顺序,使平面剩余面积尽可能小. 解题思路:由于$n\leq 6$,我们可以dfs油滴扩展顺序,然后计算每个油滴能扩展的半径即可.时间复杂度$O(n!)$. 注意:①$\pi$的精度不能太小:②有些油滴包含在另一个油滴内部,则不能扩展:③题目要求四舍五入,则保留0位小数即可. 当然也可以用STL的全排列算法把所有排列求出来,然后按照排列顺序扩展. C++ Code: #include<

P1378 油滴扩展

P1378 油滴扩展 题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴.那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合) 注:圆的面积公式V=pi*r*r,其中r为圆的半径. 输入输出格式 输入格式: 第1行一个整数N. 第2行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y

洛谷 P1378 油滴扩展 改错

P1378 油滴扩展 题目描述 在一个长方形框子里,最多有\(N(0≤N≤6)\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴.那么应该按照怎样的顺序在这\(N\)个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合) 输入输出格式 输入格式: 第1行一个整数N. 第2行为长方形边框一个顶点及其对角顶点的坐标,\(x,y,x',y'\). 接下去\(N\)行,每行

[LG1378] 油滴扩展

暴力枚举油滴的编号的排列(next_permutation),然后按序一个一个扩展.面积的求最小值即可.也可以深搜. 复杂度 \(O(n!\times n^2)\). #include<cstdio> #include<algorithm> #include<cmath> #define sq(a) ((a)*(a)) #define PI 3.1415926535897932626 using namespace std; int n,l,r,u,d;//rtg in

P1378 油滴扩展 - DFS

传送门 思路:由于n<=6,我们可以枚举油滴放置顺序的排列,然后DFS.对于每个油滴,其能扩散的最小半径为min{到四个边界的距离,到已添加的点的扩散范围的最小距离}.最后注意四舍五入:printf("%d",(int)ans+0.5);(其中ans为double类型). AC Code: #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> u

luogu cogs 421. HH的项链

★★★   输入文件:diff.in   输出文件:diff.out   简单对比 时间限制:1 s   内存限制:256 MB 问题描述:HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此,他的项链变得越来越长.有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答...因为项链实在是太长了.于是,他只好求助睿智的你,来解决这个问题.输入格式:第一行:一个

luogu cogs P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式