zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/14293509.html
Copyright © 2011-2022 走看看