Area in Triangle

在这里插入图片描述
Samples
Input Copy
12.0000 23.0000 17.0000 40.0000
84.0000 35.0000 91.0000 210.0000
100.0000 100.0000 100.0000 181.3800
0 0 0 0
Output
Case 1: 89.35
Case 2: 1470.00
Case 3: 2618.00

题意: 给出你一个三角形的三条边长,再给出你一个绳长,问你在三角形中围成的最大面积?
思路:
一共三种情况:

  • 1.当给出的绳长大于等于三角形周长时,那么围成的最大面积肯定就是三角形本身。
  • 2.当给出的绳长小于等于三角形的内切圆周长时,围成的最大面积就是这个绳长围成的圆,绳长为圆周长。
    1. 介于他俩之间 我们找出一个相似三角形就是差的边长构成的三角形与原三角形相似。
      在这里插入图片描述
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=1e9+7;
const int MOD=10007;
double qpow(double a,ll b) {
    
    
    double ans=1;
    while(b) {
    
    
        if(b&1) ans=ans*a;
        b>>=1;
        a=a*a;
    }
    return ans;
}

int main() {
    
    
    double a,b,c,sum;
    ll T=0;
    while(cin>>a>>b>>c>>sum){
    
    
        if(!a&&!b&&!c&&!sum) break;
        double pi=acos(-1);
        double l=a+b+c;
        double ja=(b*b+c*c-a*a)/(2*b*c);
        double s=0.5*b*c*sqrt(1-ja*ja);
        double r=s*2/l;
        if(sum>=l) {
    
    
            printf("Case %lld: %.2lf\n",++T,s);
        }else {
    
    
            if(2*pi*r>=sum){
    
    
                printf("Case %lld: %.2lf\n",++T,sum*sum/(4*pi));
            }else {
    
    
            double bi=(l-sum)/(l-2*pi*r);
            double ans1=r*bi;
            printf("Case %lld: %.2lf\n",++T,s-s*bi*bi+pi*ans1*ans1);
            }
        }

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45911397/article/details/114379015