ACM 11579 11579 - Triangle Trouble
作法:由於資料量太大,請先用快排由大排到小,每連續三個,看看使否能夠成三角形,再利用海龍公式求面積
海龍公式:假設邊長a,b,c
s=(a+b+c)/2
面積=sqrt((s-a)*(s-b)*(s-c)*s)
/*********************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int partition(double[], int, int);
void quicksort(double[], int, int);
main()
{
int a,n,t;
scanf("%d",&t);
while(t--)
{
double num[100001]={0},top=0;
scanf("%d",&n);
for(a=0;a<n;a++)
scanf("%lf",&num[a]);
double max=0.0;
quicksort(num,0,n);
for(a=0;a<n-2;a++)
{
if(num[a+2]+num[a+1]<=num[a]) continue;
double ss=(num[a]+num[a+1]+num[a+2])/2.0;
if(max<sqrt(ss*(ss-num[a])*(ss-num[a+1])*(ss-num[a+2])))
max=sqrt(ss*(ss-num[a])*(ss-num[a+1])*(ss-num[a+2]));
}
printf("%.2lf\n",max);
}
return 0;
}
int partition(double num[],int left,int right)
{
int a=left-1,b;
double s=num[right];
for(b=left;b<right;b++)
{
if(num[b]>=s)
{
a++;
double temp;
temp=num[a];
num[a]=num[b];
num[b]=temp;
}
}
double temp;
temp=num[a+1];
num[a+1]=num[right];
num[right]=temp;
return a+1;
}
void quicksort(double num[],int left,int right)
{
int q;
if(left<right)
{
q=partition(num,left,right);
quicksort(num,left,q-1);
quicksort(num,q+1,right);
}
}