1. 程式人生 > >洛谷P1378 油滴擴展

洛谷P1378 油滴擴展

getchar() class ati lin har getch main include its

題目

在一個長方形框子裏,最多有N(0≤N≤6)個相異的點,在其中任何一個點上放一個很小的油滴,那麽這個油滴會一直擴展,直到接觸到其他油滴或者框子的邊界。必須等一個油滴擴展完畢才能放置下一個油滴。那麽應該按照怎樣的順序在這N個點上放置油滴,才能使放置完畢後所有油滴占據的總體積最大呢?(不同的油滴不會相互融合)

註:圓的面積公式V=pirr,其中r為圓的半徑。

分析

用stl自帶的next_permutation 枚舉油滴擴展的順序(最多720種)

每確定一種順序,求一次答案

貪心地將當前點擴展到最大,如果當前點已經被前面的油滴覆蓋到,那麽這個點不放油滴 , 畫圖可以感性認識,這種情況最大,不知道怎麽證明...

最後輸出答案,四舍五入就是將當前的小數答案+0.5 再向下取整

代碼


#include<bits/stdc++.h>

#define For(i,a,b) for(int i=(a); i<=(b) ; i++)

#define _For(i,a,b) for(int i=(a); i>=(b) ; i--)

#define Memset(a,b); memset((a),(b),sizeof((a)));

#define Cout(a,b);  printf("%d",(a));printf(b);

#define Coutc(a,b);  printf("%c",(a));printf(b);
#define Couts(a,b); printf("%s",(a));printf(b); using namespace std; const int INF = 0x3f3f3f3f; typedef long long LL;typedef unsigned long long ULL;typedef long double LDB; inline LL CinLL(){LL x=0,f=1;char ch=getchar();while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}while(ch>=‘0‘
&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}return x*f;} inline int Cin(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();return f*x;} struct cre{ double x,y,r,are; bool use; }a[10]; const double p = acos(-1); const double eps = 1e-8; double xx1,yy1,xx2,yy2; int n; int sx[] = {0,1,2,3,4,5,6}; inline double dis(double xa,double ya,double xb,double yb){ return sqrt((xb - xa) * (xb - xa) + (yb - ya ) * (yb - ya)); } double solve() { For(i,1,n) { int now = sx[i]; double rr = 99999999; int flag = 0; For(j,1,i-1) if(dis(a[now].x,a[now].y,a[sx[j]].x,a[sx[j]].y) <= a[sx[j]].r){ a[now].use = false;flag = 1;break; } if(flag)continue; For(c,1,i-1){ int j= sx[c];if(a[j].use == false) continue; double kk = dis(a[now].x,a[now].y,a[j].x,a[j].y) - a[j].r; rr = rr < kk ? rr : kk; } rr = rr < (a[now].x - xx1) ? rr : (a[now].x - xx1); rr = rr < (xx2 - a[now].x) ? rr : (xx2 - a[now].x); rr = rr < (a[now].y - yy1) ? rr : (a[now].y - yy1); rr = rr < (yy2 - a[now].y) ? rr : (yy2 - a[now].y); a[now].r = rr; a[now].are = p * a[now].r * a[now].r; a[now].use = true; } double sum = 0; For(i,1,n) sum += a[i].are; return sum; } int main() { ios::sync_with_stdio(false); cin>>n; cin>>xx1>>yy1>>xx2>>yy2; if(xx1 > xx2){ swap(xx1,xx2);swap(yy1,yy2); } if(yy1 > yy2) swap(yy1,yy2); For(i,1,n) cin>>a[i].x>>a[i].y; double ans = 0; double tim = 1; For(i,2,n) tim*=i; For(i,1,tim) { For(j,1,n) { a[j].are = a[j].r = 0; a[j].use = false; } double k = solve(); ans = ans > k ? ans : k; next_permutation(sx+1,sx+n+1); } double res = (xx2 - xx1) * (yy2 - yy1) - ans; int ress = (res + 0.5+eps); cout<<ress; }

洛谷P1378 油滴擴展