Sky Garden icpc上海站 2020
题目大意:
给一个n和一个m,表示画了n个同心圆,第 i
个圆的半径长度是i
,m条穿过圆心的线,把所有的圆都等分成2*m
份,直线与圆之间相交得到若干个交点,问最后任意两个点之间的距离是多少?
题解:
这个题目难度比较低,思路比较简单,可能是自己很久没有写题目了,所以写出很多bug。
思路:
- 对于一个圆上的点,如果要到该圆上其他的点,分成两种走法:
- 沿着圆弧走
- 沿着半径走
- 如果两个点不在同一个圆上,那么把走的过程分成两个部分,我设定从大圆往小圆走
- 首先沿着半径走到目标点所在的圆
- 其次就转化成第一个问题了
坑点:
-
首先就是这个思路第一点的写法,不同的写法可能会出现一点点小问题
-
其次就是我不太明白为什么,double += int 这个会出现问题
这个2.0 如果换成2 就wa了。。。
#include <bits/stdc++.h>
#define PI acos(-1)
using namespace std;
typedef long long ll;
int main(){
int n,m;
scanf("%d%d",&n,&m);
if(m==1){
double ans = 0;
for(int i=1;i<=n;i++) ans += i*(2*n-i)*2;
printf("%.10f
",ans);
return 0;
}
double sum = 0;
for(int i=1;i<m;i++){
if(PI*i<2*m) sum+=PI*i/m;
else sum+=2;
}
sum *= 2,sum += 2;
// printf("sum = %f
",sum);
double ans = 0;
for(int i=1,now = 1;i<=n;i++,now+=2*m){
ans =ans + (n - i + 1)*now*2.0*m;
}
// printf("ans = %f
",ans);
for(int i=1,now = 0;i<=n;i++,now+=2*m) {
ans += sum * m * (n - i + 1) + sum * now * (n - i + 1);
}
printf("%.10f
",ans);
return 0;
}