zoukankan      html  css  js  c++  java
  • HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交、内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度)。

    思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了。题目好像不用讨论给的圆包含源点圆的情况(0?),那么只剩内含(不变)、相切(增加小圆周长)、相离(不变)、相交(余弦定理求一下)。余弦定理都快忘了,本来打算构建rt三角形233。学到一招pi = acos(-1.0)。

    代码:

    #include<cstdio>
    #include<set>
    #include<map>
    #include<cmath>
    #include<stack>
    #include<vector>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<sstream>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int maxn = 100+10;
    const int INF = 0x3f3f3f3f;
    double dis(double x1,double y1){
        return sqrt(x1 * x1 + y1 * y1);
    }
    int main(){
        int T;
        double pi = acos(-1.0);
        char n[12];
        scanf("%d",&T);
        while(T--){
           double ans;
           double R;
           int m;
           scanf("%d%lf",&m,&R);
           ans = 2 * R * pi;
           while(m--){
               double x,y,r;
               scanf("%lf%lf%lf",&x,&y,&r);
               double dist = dis(x,y);
               if(dist + r == R){
                    ans += 2 * r * pi;
               }
               else if(dist >= r + R || dist + r < R){
                    continue;
               }
               else{
                    double del = acos((R * R + dist * dist - r * r) / (2 * dist * R));
                    double si = acos((r * r + dist * dist - R * R) / (2 * dist * r));
                    ans = ans - del * R * 2 + si * r * 2;
                }
           }
           printf("%lf
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    C/C++程序内存的分配
    【解题报告】UVA101 The Blocks Problem
    洗牌算法
    【持续更新】算法竞赛常用模板
    北京邮电大学2021乐理公共选修课期末考试
    Oracle通用大数据量存储过程分页修正版
    (转)NHibernate 3.0在PetShop 3层架构中的应用
    Json.Net学习笔记
    JS获得浏览器高度和宽度参数
    jQuery数组处理汇总
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9489321.html
Copyright © 2011-2022 走看看