2009-06-01 07:01:59來源不明

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);
   }
}