洛谷P1378 油滴扩展
总得来说,这道题还是比较水的(至少dfs的过程是这样)感觉上评级需要降一级
说一下dfs思路:搜索前i个油滴,所占的可能性面积最后取最大值输出。
然后几个比较需要说的点:
1.提醒一下喜欢用万能头文件的人,万能头文件关键字很多,包括left,right,up,down全部是,被坑了好久。
2.四舍五入什么的加0.5强行int是个好方法啊
3.看了下题解,发现π这种东西在“camth”库里面居然有,直接用M_PI就可以直接调用了,非常神仙。
4.处理矩形的时候处理上下左右边界真的是神仙做法啊,至少本蒟蒻没想到。。
本来想处理出矩形四角坐标,发现这样会导致码量非常大,后期处理很难,于是就翻题解le(逃,感谢卢安来巨神,写得非常详细,谢谢
没了,毕竟是水题,~~什么剪枝都不要居然是搜索EX~~,最后dd一下后方打游戏的b大爷
附上ac代码
#include<bits/stdc++.h> using namespace std; int n; double tx,ty,dis[7][7],r[7]; double pi,ans=0; double Up,Down,Left,Right; bool used[7]={false}; struct node{ double x,y; }f[7]; void dfs(int will,double sum){ if(will==n+1) ans=max(ans,sum); for(int i=1;i<=n;i++) if(!used[i]){ r[i]=min(min(f[i].x-Left,Right-f[i].x),min(Up-f[i].y,f[i].y-Down)); for(int j=1;j<=n;j++) if(used[j]) r[i]=min(r[i],dis[i][j]-r[j]); used[i]=true; if(r[i]<0) r[i]=0; dfs(will+1,sum+r[i]*r[i]*pi); used[i]=false; } return; } int main(){ pi=3.14159265358979323846; scanf("%d",&n); scanf("%lf%lf",&tx,&ty); Left=Right=tx;Up=Down=ty; scanf("%lf%lf",&tx,&ty); Left=min(Left,tx);Right=max(Right,tx); Down=min(Down,ty);Up=max(Up,ty); for(int i=1;i<=n;i++) scanf("%lf %lf",&f[i].x,&f[i].y); for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++){ dis[i][j]=sqrt((f[i].x-f[j].x)*(f[i].x-f[j].x)+(f[i].y-f[j].y)*(f[i].y-f[j].y)); dis[j][i]=sqrt((f[i].x-f[j].x)*(f[i].x-f[j].x)+(f[i].y-f[j].y)*(f[i].y-f[j].y)); } dfs(1,0.0); int g=(int)((Up-Down)*(Right-Left)-ans+0.5); printf("%d",g); return 0; }