• 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
    ",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;
    }
    
  • 相关阅读:
    分布式锁获取token
    美团-2019Q2述职总结
    linux df 日志删除命令分析
    MySQL、HBase、ES的特点和区别
    C++函数返回局部变量
    C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理
    C Mysql API连接Mysql
    C++运算符重载
    C++对象赋值的四种方式
    C/C++下scanf的%匹配以及过滤字符串问题
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/14293509.html
Copyright © 2020-2023  润新知