洛谷 P1378 油滴擴展 改錯
阿新 • • 發佈:2018-05-20
輸入輸出 main for 怎樣 span 融合 void HR 整數 內。
P1378 油滴擴展
題目描述
在一個長方形框子裏,最多有\(N(0≤N≤6)\)個相異的點,在其中任何一個點上放一個很小的油滴,那麽這個油滴會一直擴展,直到接觸到其他油滴或者框子的邊界。必須等一個油滴擴展完畢才能放置下一個油滴。那麽應該按照怎樣的順序在這\(N\)個點上放置油滴,才能使放置完畢後所有油滴占據的總面積最大呢?(不同的油滴不會相互融合)
輸入輸出格式
輸入格式:
第1行一個整數N。
第2行為長方形邊框一個頂點及其對角頂點的坐標,\(x,y,x’,y’\)。
接下去\(N\)行,每行兩個整數\(x_i,y_i\),表示盒子的\(N\)個點的坐標。
以上所有的數據都在\([-1000,1000]\)
輸出格式:
一行,一個整數,長方形盒子剩余的最小空間(結果四舍五入輸出)
爆搜一下即可,這個幽默的數據。
然而,它居然問的是最小空間!!!!
我輸出了最大面積。。。。
而且樣例給的最小空間居然等於最大面積,絕對故意的。。。
code:
#include <cstdio> #include <cmath> const int N=7; const double pi=3.1415926; int up,ri,le,dow,x[N],y[N],n; double fmax(double a,double b) {return a>b?a:b;} double fmin(double a,double b) {return a<b?a:b;} int min(int a,int b) {return a<b?a:b;} int abs(int a) {return a>0?a:-a;} int used[N]; double yuan[N],ans=0,dis[N][N];//圓的半徑 double get(int a,int b) { return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])); } void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=get(i,j); } double get(int id) { double rm=1e300; rm=min(min(x[id],ri-x[id]),min(y[id],up-y[id])); for(int i=1;i<=n;i++) if(yuan[i]!=0) rm=fmin(dis[id][i]-yuan[i],rm); return fmax(0.0,rm); } void dfs(int dep) { if(dep==n+1) { double sum=0; for(int i=1;i<=n;i++) sum+=yuan[i]*yuan[i]*pi; ans=fmax(sum,ans); return; } for(int i=1;i<=n;i++) if(!used[i]) { used[i]=1; yuan[i]=get(i); dfs(dep+1); yuan[i]=0.0; used[i]=0; } } int main() { int x1,y1,x2,y2; scanf("%d",&n); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); up=abs(y1-y2),ri=abs(x1-x2); le=min(x1,x2),dow=min(y1,y2); for(int i=1;i<=n;i++) { scanf("%d%d",x+i,y+i); x[i]-=le,y[i]-=dow; } init(); dfs(1); ans=double(up*ri)-ans; int an=int(ans+0.5); printf("%d\n",an); return 0; }
2018.5.20
洛谷 P1378 油滴擴展 改錯