洛谷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;
}

 

posted @ 2018-09-26 00:09  Hadesa  阅读(90)  评论(0编辑  收藏  举报