Sky Garden
#include<bits/stdc++.h>
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
typedef double db;
const int N=1005;
db anlen[N];
int main() {
int n,m;
scanf("%d %d",&n,&m);
db ans=0;
int dian=m*2;
int a=floor((1.0/pi)*dian)*2,b=dian-(a+1);//求出该走直线的点有几个,该走圆弧的点有几个
for(int i=1; i<=n; ++i) {//求出该圆上的某个点到该圆上的其他点的最短距离的和
anlen[i]=((a/2)*(a/2+1)/2)*2*pi*i*2/dian;
anlen[i]+=b*2*i;
}
for(int i=1; i<=n; ++i) {//求出该圆上的点到其他所有点的最短距离的和
db cut=0;
for(int j=1; j<=n; ++j) {
cut+=1.0*abs(i-j)*dian;
if(j<=i)cut+=anlen[j];
else cut+=anlen[i];
}
cut*=dian;//乘以点数
ans+=cut;
}
ans/=2.0;
if(m!=1)ans+=(n*(n+1)/2)*dian;//求出所有点到圆心的距离和(如果有圆心的话)
printf("%.10lf\n",ans);
return 0;
}
认真写,仔细算,这道题其实是不难的。附上草稿纸一张。
依然改变不了我打铁的事实