1 条题解
-
1
比较简单的深搜(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
- 上传者