hihoCoder挑战赛16 A—— 王胖浩与三角形

来源:互联网 发布:mac os教程 编辑:程序博客网 时间:2024/05/24 01:48

思路:开始没有思路,想到了用三边乱搞(每条边按照比例增加)然而样例都无法通过。后来想到了海伦公式sqrt((a+b+c)(a+b-c)(b+c-a)(a+c-b))/4,那么这样以来就是让这个三角形趋于正三角形了,即三边的方差最小,那么依次是先补最短,次短,长(贪心的算法)。


code:


#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <sstream>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef long double ld;const int INF=0x3fffffff;const int inf=-INF;const int N=1000000;const int M=2005;const int mod=1000000007;const double pi=acos(-1.0);#define cls(x,c) memset(x,c,sizeof(x))#define cpy(x,a) memcpy(x,a,sizeof(a))#define fr(i,s,n) for (int i=s;i<=n;i++)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lrt  rt<<1#define rrt  rt<<1|1#define middle int m=(r+l)>>1#define lowbit(x) (x&-x)#define pii pair<int,int>#define mk make_pair#define IN freopen("in.txt","r",stdin);#define OUT freopen("out.txt","w",stdout);double a[3],l;double sd(double a,double b,double c){    double p=(a+b+c)*0.5;    return sqrt(p*(p-a)*(p-b)*(p-c));}double sol(){    double t=min(l,a[1]-a[0]);    a[0]+=t,l-=t;    if (l>0)    {        t=min(l*0.5,(a[2]-a[1]));        a[1]+=t;        a[0]+=t;        l-=t*2;        //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;        if (l>0)        {            fr(i,0,2)            a[i]+=1.0*l/3;        }    }    //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;    return sd(a[0],a[1],a[2]);}int main(){    int T;    scanf("%d",&T);    while (T--)    {        scanf("%lf %lf %lf %lf",&a[0],&a[1],&a[2],&l);        sort(a,a+3);        printf("%.10f\n",sol());    }}




0 0
原创粉丝点击