Sky Garden icpc上海站 2020

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\n",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\n",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\n",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\n",ans);
    return 0;
}
posted @ 2021-01-18 16:46  EchoZQN  阅读(134)  评论(0编辑  收藏  举报