1 条题解

  • 1
    @ 2022-8-13 11:28:07

    比较简单的深搜(dfs)

    直接贴上代码

    #include<bits/stdc++.h>
    using namespace std;
    
    const double pi=3.1415926;
    int n;
    double xa,ya,xb,yb,ans=-1e9;
    double x[10],y[10],s[10],r[10];//定义
    
    double radius(int a){//求第a个油滴的半径
    	double d1=min(abs(x[a]-xa),abs(x[a]-xb));
    	double d2=min(abs(y[a]-ya),abs(y[a]-yb));
    	double mind=min(d1,d2);
    	for(int i=1;i<=n;i++){
    		if(i!=a&&s[i]==1){//枚举离他最近的油滴
    			double t=sqrt((x[a]-x[i])*(x[a]-x[i])+(y[a]-y[i])*(y[a]-y[i]))-r[i];//用勾股定理求距离
    			mind=min(mind,max(t,0.0));//若t<0说明这个油滴被其他油滴包含了
    		}
    	}
    	return mind;
    }
    
    void dfs(int k,double sum){//深搜(应该不用我解释了吧
    	if(k>n){//已经滴了所有的点
    		ans=max(ans,sum);
    		return;
    	}
    	for(int i=1;i<=n;i++){
    		if(s[i]==0){//0代表没滴,1表示已经滴过了
    			r[i]=radius(i);
    			s[i]=1;
    			dfs(k+1,sum+r[i]*r[i]*pi);
    			s[i]=0;//记得要改回来
    		}
    	}
    }
    
    int main(){
    	memset(s,0,sizeof(s));
    	cin>>n;
    	cin>>xa>>ya>>xb>>yb;
    	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];//输入
    	dfs(1,0);
    	double area=abs(xa-xb)*abs(ya-yb);//面积
    	cout<<(int)(area-ans+0.5);
    }
    
    • 1

    信息

    ID
    378
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    17
    已通过
    7
    上传者