社区讨论
还是那个神奇的第八个点
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 条回复,欢迎继续交流。
正在加载回复...