ZOJ 3806 Incircle and Circumcircle 【几何】【special judge】

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3806

题目大意:给一个三角形的外接圆半径以及内切圆半径,求满足给出条件的三角形的三条边。

题目给出的样例有点坑.......容易误导人

Sample Input

1 2
2 5
9 9

Sample Ouput

3.464101615137754587 3.464101615137754587 3.464101615137754587
6 8 10
NO Solution!

给出的2和5的例子的时候其答案给出的是三个整数。所以会有点误导。

最开始看见题目的时候被样例误导了,一直没有什么思路,后来在纸上画了很久发现了一个特例。

YY给出的内切圆和外切圆的圆心是在一个直线上面的,然后是可以根据正弦定理以及一系列的变形得到长度x和角度α之间的关系。

然后数学公式可以得出:角度α和x的公式为

x =( 1 + 1 / sin(α) )/ (2 - 2*sin(α)*sin(α))

根据公式二分sin(α)

sin(α)的取值范围是0~1,比较与输入x 的大小,重新确定上界下界。(此函数是一个递增的)

求得sin(α)后可以根据x的大小以及α角度一些关系得到三角形的三条边。

注意变换之后默认的内切圆半径是1,故求得的三角形三边要乘于R/r

#include<iostream>
#include<math.h>
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;

#define eps 1e-11
double er(double x)
{
    double l = 0, r = 1, mid;
    while(l<r){
        mid = (l+r)/2;
        //printf("%.9lf %.9lf\n",l,r);
        double temp = (1.0+1.0/mid)/(2.0-2.0*(mid*mid));
        if(temp-x>eps)   l = mid;
        else if(temp+eps<x) r = mid;
        else break;
    }
    //printf("%.13lf\n",mid);
    return mid;
}

int main ()
{
    double n,m;
    while(~scanf("%lf %lf",&n,&m)){
        double bi=m/n;
        if((bi-2)<-eps) {printf("NO Solution!\n");continue;}
        double sinx=er(bi);
        double cosx=sqrt(1-sinx*sinx);
        double y = (1.0 + 1.0/sinx)/cosx;
        double t = (1.0+sinx)/cosx;

        printf("%.18lf %.18lf %.18lf\n",y*n,y*n,2*t*n);

    }
}

忽略我的函数名称定义以及...... 出现的一个er(bi)   ........

时间: 2024-11-05 14:42:38

ZOJ 3806 Incircle and Circumcircle 【几何】【special judge】的相关文章

zoj 3806 Incircle and Circumcircle(二分)

题目链接:zoj 3806 Incircle and Circumcircle 题目大意:给定三角形的内接圆半径和外切圆半径,求三角形的三边长. 解题思路:以等腰三角形去构造,确定外切圆半径的时候,内切圆半径的范围为0?3 ̄ ̄√R,二分判断即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; double f (d

ZOJ 3806 Incircle and Circumcircle

题意:已知三角形的内接圆半径和外接圆半径,求符合的三角形边长 思路:假设是等腰三角形,内接圆半径最大的情况是等边三角形,直接在(0,pi/3)范围内二分底角 #include <iostream> #include <cmath> #include <stdio.h> #include <algorithm> using namespace std; #define eps 1e-10 double pi=2*asin(1.0); int main() {

Incircle and Circumcircle(二分+几何)浙大月赛zoj3806(详解版)图

Incircle and Circumcircle Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A triangle is one the basic shapes in geometry. It's a polygon with three vertices and three sides which are line segments. A triangle with vertices A, B, C is denot

Special Judge Ⅱ

Problem Description Q:什么是 Special Judge,Special Judge 的题目有什么不同? A:一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被 Special Judge.Special Judge 程序使用输入数据和一些其他信息来判答程序的输出,并将判答结果返回. NaYe 最近遇到了一个题,要求输出三个数,第三个数为前两个数的和,三个数都是素数,且前两个数小于 500000.他只需要输出任意一组符合要求的答案即认为是 Accepted.现在需

【教程】如何正确的写一个Lemon/Cena的SPJ(special judge)

转自:http://www.cnblogs.com/chouti/p/5752819.html Special Judge:当正确的输出结果不唯一的时候需要的自定义校验器 首先有个框架 #include<fstream> ifstream fin,fout,fstd ofstream fscore,freport; double Judge(){ } int main(int argc,char *argv[]) { //put something to fstreams... //Judge

lemon Special Judge 模板

嗯,就是一个模板的事. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 ifstream fin,fout,fstd; 6 ofstream fscore,freport; 7 // 注意定义 8 9 double judge() 10 { 11 /* 12 关于读入与输出:与cin/cout类似 13 Eg. 14 fin >> x; //从输入文件里读入x 15 freport << "too

ZOJ 3598 Spherical Triangle球面几何公式应用

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #inc

二分 题目 压缩打包 Special Judge? 不不不 当然不是

http://noi.openjudge.cn/ch0111/ No 题目 分数 01 查找最接近的元素 10 3176 02 二分法求函数的零点 10 2181 03 矩形分割 10 1420 04 网线主管 10 1648 05 派 10 1581 06 月度开销 10 1449 07 和为给定数 10 1906 08 不重复地输出数 10 1790 09 膨胀的木棍 10 768 10 河中跳房子 10 2027 ------------------------------萌萌的分割线--

lemon special judge模板

/* argv[1]:输入文件 argv[2]:选手输出文件 argv[3]:标准输出文件 argv[4]:单个测试点分值 argv[5]:输出最终得分的文件 argv[6]:输出错误报告的文件 */ #include<bits/stdc++.h> int n,k,a[100100]; using namespace std; void out_false1(); void out_false2(); void out_ok(); int main(int argc,char *argv[])