油滴扩散

xiaoxiao2021-02-28  68

这个题很恶心啊。。 精度处理太tm恶心了。。。。。。。。。。。 思路: 因为n<=6,这也太小了 直接求出全排列来,求出所有点之间的距离,这个点扩展的距离就等于到已确定的点的距离-它的半径的最小值,然后一点点模拟。。 距离小于之前的半径了,就把他的半径付为零,我因这wa曾了四个点

#include<cstdio> #include<iostream> #include<cmath> #include<cstring> using namespace std; const double p=3.1415926535; double xx,x2,yy,y2,x[19999],y[19999]; bool ff[3000]; int n; double w[199999],f[1999][1999],minn=9999999999; int b[199999]; double jl(double x,double y,double z,double w){ double xxx=x-z; double yyy=y-w; return (double)sqrt(xxx*xxx+yyy*yyy); } double min(double x,double y) { return x<y?x:y; } double abs2(double x) { return x>=0?x:-x; } void dfs(int ww){ if(ww==n+1) { memset(w,127,sizeof(w)); for(int i=1;i<=n;i++) { w[b[i]]=min(abs2(x[b[i]]-(double)x2),abs2((double)xx-x[b[i]])); w[b[i]]=min(abs2(y[b[i]]-(double)y2),w[b[i]]);w[b[i]]=min(abs2((double)yy-y[b[i]]),w[b[i]]); for(int j=1;j<i;j++) { w[b[i]]=min(w[b[i]],f[b[i]][b[j]]-w[b[j]]); if(w[b[i]]<0)w[b[i]]=0; } } double www=(double)abs(xx-x2)*abs(yy-y2); for(int i=1;i<=n;i++) { //printf("%lf ",w[b[i]]); www-=w[b[i]]*w[b[i]]*p; } minn=min(minn,www); return ; } for(int i=1;i<=n;i++) { if(!ff[i]) { b[ww]=i; ff[i]=1; dfs(ww+1); ff[i]=0; } } } int main() { scanf("%d",&n); scanf("%lf%lf%lf%lf",&x2,&y2,&xx,&yy); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i!=j) { f[i][j]=jl(x[i],y[i],x[j],y[j]); } } dfs(1); printf("%d",int(minn+0.5)); return 0; }
转载请注明原文地址: https://www.6miu.com/read-53556.html

最新回复(0)