社区讨论

还是那个神奇的第八个点

P1378油滴扩展参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi7rw254
此快照首次捕获于
2025/11/21 02:36
4 个月前
此快照最后确认于
2025/11/21 02:36
4 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<cmath>
#define MAXN 11
using namespace std;
const double PI=3.1415926;
int n;
double lx,ly,rx,ry;
double xx[MAXN],yy[MAXN];
double ans=0;//答案,取最大值 
double an=0;//中间答案 
bool vis[MAXN];//某个点是否被遍历过了

double s[MAXN][MAXN];
//若i选了 j半径最大能是多少
inline double Zh(double x) {
	if(x>=0) return x;
	else return -x;
} 

inline void init() {
	//预处理一些变量 
	for(int i=1;i<=n;i++) {
		for(int j=i+1;j<=n;j++) {
			double ri=min(Zh(xx[i]-lx) ,min(Zh(xx[i]-rx),min(Zh(yy[i]-ly),Zh(yy[i]-ry))));
			double rj=min(Zh(xx[j]-lx) ,min(Zh(xx[j]-rx),min(Zh(yy[j]-ly),Zh(yy[j]-ry))));
			double dis=sqrt((xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]));
			if(dis>=ri+rj) s[i][j]=rj,s[j][i]=ri;
			else {
				s[i][j]=dis-ri; s[j][i]=dis-rj;
				if(s[i][j]<0) s[i][j]=0;
				if(s[j][i]<0) s[j][i]=0;
			}		
		}
	}
}
inline double solve(int x) {
	double len=0x3f3f3f3f;
	for(int i=1;i<=n;i++) {
		if(!vis[i]) continue;
		len=min(len,s[i][x]);
	}
	return len;
	//求出某个点的最大半径 
}
inline void dfs(int now,int num) {
	//now当前点 num已经处理完的点 
	if(num==n) {
		ans=max(ans,an);
		return;
	}
	for(int i=1;i<=n;i++) {
		if(vis[i]) continue;
		double rr=solve(i);//当前半径
		vis[i]=true;
		an+=rr*rr*PI; 
		dfs(i,num+1);
		an-=rr*rr*PI;
		vis[i]=false;
	}
} 
int main() {
	scanf("%d",&n);
	scanf("%lf%lf%lf%lf",&lx,&ly,&rx,&ry);
	for(int i=1;i<=n;i++) scanf("%lf%lf",&xx[i],&yy[i]);
	init();
	for(int i=1;i<=n;i++) {
		vis[i]=true;
		double rrr=min(Zh(xx[i]-lx) ,min(Zh(xx[i]-rx),min(Zh(yy[i]-ly),Zh(yy[i]-ry))));
		an=rrr*rrr*PI; 
		dfs(i,1);
		vis[i]=false;
	}
	int aaa=(int) ans;
	if(ans-(double)aaa >= 0.5) aaa++;
	int sa=(int)Zh((lx-rx)*(ly-ry));
	printf("%d",sa-aaa);
	return 0;
}
第八个点 正确答案:819426 我:822020 ?????? 哪里出了毛病,求助

回复

5 条回复,欢迎继续交流。

正在加载回复...