洛谷 P1378 油滴扩展 Label:搜索
题目描述
在一个长方形框子里,最多有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
输出样例#1:
50
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<cstdlib>#include<cmath>#define ll long long#define eps 1e-8#define INF 0x3f3f3f3f#define pi 3.141592653589usingnamespacestd;structcc{doublex,y;}nod[10];doubled_nod[10][10],d_wall[10];doubler[10];intN,S,vis[10];doubleans;doublecal_d(inti,intj){doublex1=nod[i].x,y1=nod[i].y,x2=nod[j].x,y2=nod[j].y;returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}doublecal_s(doubler){returnpi*r*r;}voidinit_(){doublex1,x2,y1,y2;scanf("%d",&N);scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);S=abs(x1-x2)*abs(y1-y2);for(inti=1;i<=N;i++){scanf("%lf%lf",&nod[i].x,&nod[i].y);}for(inti=1;i<=N;i++){for(intj=i+1;j<=N;j++){d_nod[i][j]=d_nod[j][i]=cal_d(i,j);}}memset(d_wall,0x3f,sizeof(d_wall));for(inti=1;i<=N;i++){doublex=nod[i].x,y=nod[i].y;d_wall[i]=min(abs(x-x1),abs(x-x2));doubletmp=min(abs(y-y1),abs(y-y2));d_wall[i]=min(tmp,d_wall[i]);}}voiddfs(intx,intdep){doublenowr=d_wall[x];for(inti=1;i<=N;i++){if(i==x)continue;if(vis[i]) nowr=min(nowr,d_nod[x][i]-r[i]);}if(nowr<0) nowr=0;r[x]=nowr;if(dep==N){doublesum=0.0;for(inti=1;i<=N;i++) sum+=cal_s(r[i]);ans=max(ans,sum);// for(int i=1;i<=N;i++) cout<<r[i]<<endl;// puts("-------------");return;}vis[x]=1;for(inti=1;i<=N;i++){if(!vis[i]) dfs(i,dep+1);}r[x]=0;vis[x]=0;}voidwork(){for(inti=1;i<=N;i++) dfs(i,1);cout<<(int(S-ans+0.5))<<endl;}intmain(){// freopen("01.in","r",stdin);init_();work();return0;}这是我写过的最最最朴素的搜索,没有之一
Line 59 这样写只有60分 nowr=min(nowr,d_nod[x][i]-r[i]);
然后圆周率总得背几位出来吧
给你萌安利一个背数字的好方法,想背啥把啥当作手机密码或者某个账的密码
听3.14159265358979323846
不仅可以锻炼记忆力,还可以让你戒掉手机hhh
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!


浙公网安备 33010602011771号