zoukankan      html  css  js  c++  java
  • codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述

    之前几乎没写过什么这种几何的计算题。在众多大佬的博客下终于记起来了当时的公式。嘚赶快补计算几何和概率论的坑了。。。

    这题的要求,在对两圆相交的板子略做修改后,很容易实现。这里直接给出代码。重点的部分有:两圆在相离(或外交)时输出第一个圆的面积、内涵(或内切)则需要分类讨论,是羊的圈大、还是狼的圈大。以下是代码:

    #include<iostream>
    #include<cmath>
    #include<stdio.h>
    using namespace std;
    int main()
    {
    	double a,b,c,d,e,f,jiao1,jiao2,s1,s2,s3,s4,l,py;
    	int t,s,j;
    	py=2*acos(0);
    	//cout<<py<<endl;
    	j=1;
    	cin>>t;
    	while(t--)
    	{
    		cin>>a>>b>>c;
    		cin>>d>>e>>f;
    		l=sqrt((d-a)*(d-a)+(e-b)*(e-b));//l是两圆的圆心距 
    		if(l<=fabs(c-f))//如果内涵(切) 
    		{
    			if(c>f) 
    			{
    				cout<<"Case #"<<j++<<": ";
    				printf("%.11lf",py*(c*c-f*f));
    				cout<<endl;
    			}
    			else cout<<"Case #"<<j++<<": "<<"0"<<endl;
    			continue;
    		}
    		else if(l>=c+f)//如果相离(外切) 
    		{
    			cout<<"Case #"<<j++<<": ";
    			printf("%.11lf",py*c*c);
    			cout<<endl;
    			continue;
    		}
    		//以下为一般的相交情况 
    		jiao1=acos((l*l+c*c-f*f)/(2*l*c));//余弦定理求出第一个圆对应圆心角的一半 
    		jiao2=acos((l*l+f*f-c*c)/(2*l*f));//同理求第二个圆 
    		s1=jiao1*c*c;//第一个圆对应的扇形 
    		s2=jiao2*f*f;//第二个圆对应扇形 
    		s3=c*c*sin(jiao1)*cos(jiao1);//第一个圆心角对应的三角形 
    		s4=f*f*sin(jiao2)*cos(jiao2);//第二个圆心角对应的三角形 
    		cout<<"Case #"<<j++<<": ";
    		printf("%.11lf",py*c*c-(s1+s2-s3-s4));//输出第一个圆的面积减去公共部分面积 
    		cout<<endl;
    		//cout<<s1+s2-s3-s4<<endl;
    		//在这里, s1+s2-s3-s4是圆的公共部分面积 
    	}	
    }
    

      圆心角对应的三角形可能会比较难理解,但只要画一个一般情况的图出来,模拟一边求解过程,就能更好的理解了。

     写的时候,我还因为没讨论内切情况而WA2 ,感觉几何的情况要比其他题目的多得多啊。。

    然后在这简述一下gym/100495/problem/E—Simple sequence的思路,这题也同样出现在了新生赛里。这题可以用类似尺取法的方式暴力。用两个元素l、r来标记当前段的前后位置,满足条件则尾部往后移动、不满足时就把头往后移动。在把头往后移动之前,需要讨论当前段的头是不是该区间的最大值或者最小追,若答案为是,则需要在移动后的区域里找到最大或最小值。这个暴力方法十分精妙,时间非常的逼近O(n)。很适合作为理解尺取法和区间取数的例题。

    代码本来想打的。。但是刚要测试数据的时候Dev卡死了,然后就没了QAQ

  • 相关阅读:
    源码阅读笔记 BiLSTM+CRF做NER任务(一)
    leetcode题 寻找两个有序数组的中位数
    动手实现感知机算法,多分类问题
    剪绳子 牛客网-剑指Offer_编程题
    [SCOI2016]妖怪 牛客网的ACM省选题,个人看法,欢迎交流
    BERT 学习笔记
    解决图着色问题 python代码实现
    维吉尼亚密码及程序实现
    迪菲-赫尔曼密钥交换
    分布式系统组件之配置中心
  • 原文地址:https://www.cnblogs.com/wsblm/p/8562287.html
Copyright © 2011-2022 走看看