hdu4386(求四边形最大面积)

题意:给出一个四边形的边长,求四边形最大面积。不合法输出-1;

解法:比较明显的三分,先枚举四边形的边的连接,然后三分一个对角线长度。但是比较怪异的是eps取1e-8wa了,去1e-7才可以过。不知道谁可以解释一下。

还有这题还有一个结论,后来才知道的。len是周长的二分之一。area=sqrt((len-a)*(len-b)*(len-c)*(len-d));

三分代码:

/******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-7
const double pi=acos(-1.0);
typedef long long LL;
const int Max=10100;
const int INF=1000000007;

double num[4];
int t;
double getarea(double a,double b,double c)
{
    double all=(a+b+c)/2.0;
    return sqrt(all*(all-a)*(all-b)*(all-c));
}
double solve(double a,double b,double c,double d)
{
    double left=max(b-a,d-c);
    double right=min(a+b,c+d);
    while(abs(right-left)>eps)
    {
        double mid=(right+left)/2.0;
        double midright=(mid+right)/2.0;
        if(getarea(a,b,mid)+getarea(c,d,mid)>getarea(a,b,midright)+getarea(c,d,midright))
            right=midright;
        else
            left=mid;
    }
    return getarea(a,b,left)+getarea(c,d,left);
}
int main()
{
    cin>>t;
    int  kk=1;
    while(t--)
    {
        for(int i=0; i<4; i++)
            scanf("%lf",num+i);
        if(num[0]>=num[1]+num[2]+num[3]||num[1]>=num[0]+num[2]+num[3]||
                num[2]>=num[1]+num[0]+num[3]||num[3]>=num[1]+num[2]+num[0])
        {
            printf("Case %d: -1\n",kk++);
            continue;
        }
        double ans=0;
        sort(num,num+4);
        ans=max(ans,solve(num[0],num[1],num[2],num[3]));
        ans=max(ans,solve(num[0],num[2],num[1],num[3]));
        ans=max(ans,solve(num[0],num[3],num[1],num[2]));
        printf("Case %d: %.6lf\n",kk++,ans);

    }
    return 0;
}

hdu4386(求四边形最大面积)

时间: 2024-10-16 10:47:34

hdu4386(求四边形最大面积)的相关文章

JAVA求圆的面积

import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public static void main(String[] args) { /*问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请

c++入门第一天(求圆的面积)

看了一会书,发现C++和C虽然于发上相似,但是解决问题的方式还是不一样的,毕竟面向对象和面向过程是两种不同的思维方式.下面就通过一个求圆的面积的例子,比较C和C++的不同. 需求:输入圆的半径,求解圆的面积 使用C语言来解决:1.定义两个变量半径r.面积s;  2.输入半径;  3.打印结果. 以下是源代码: #include <stdio.h> int main01() { double r, s; //定义变量圆和半径 printf("请输入圆的半径:"); scanf

求三角形的面积

1.数学知识 求三角形的面积 三边的边长分别为:a, b, c; 公式:s = (a + b + c) / 2; area = √s * ( s - a) * (s - b) * (s -c); 2.源代码 #include<iostream> #include<cmath> using namespace std; bool TriangleArea(double a, double b, double c, double &area) { if(a + b <=

数据结构——栈——求直方图最大面积

原题描述 Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The lar

心里有了阴影,求阴影部分的面积

看到一道初中数学题;心里一下子有了阴影,求阴影的面积

使用多态求矩形的面积和周长以及圆形的面积和周长

//使用多态求矩形的面积和周长以及圆形的面积我周长 Shape shape = new Circle(5); //new Square(5,6); double area = shape.GetArea(); double perimeter = shape.GetPerimeter(); Console.WriteLine(" 这个形状的面积是{0},周长是{1}",area,perimeter); Console.ReadKey(); } public abstract class

OJ刷题之《默认参数--求圆的面积》

题目描述 根据半径r求圆的面积,如果不指定小数位数,输出结果默认保留两位小数. 部分代码已给定如下,只需要提交缺失的代码. #include <iostream> #include <iomanip> using namespace std; const double PI=3.14159; /* 补充缺少代码 */ int main() { double r; int precision; cin>>r>>precision; showarea(r); s

定义一个长方形类,定义 求周长和面积的方法实例

/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: import必须出现在所有的class前面.*/ import java.util.Scanner; class ChangFangXing { //长方形的长 private int length; //长方形的宽 private int width; public ChangFangXing(){} //

c语言:任给三条边长,判断能否构成三角形,如果能,求出其面积和周长

任给三条边长,判断能否构成三角形,如果能,求出其面积和周长 程序: #include<stdio.h> #include<math.h> int main() { double a, b, c, d, s, area; printf("请输入三个正数:"); scanf("%lf%lf%lf",&a,&b,&c); if ((a + b > c) && (a + c > b) &&a