题目描述
平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多少?
输入描述:
第一行T,表示样例的个数。
对于每一组样例,第一行两个整数n和k,
接下来n行,每行两个整数x,y表示点的坐标
T<=80
3<=n<=100
-109<=x,y<=109
对于每一组样例,保证任意两点不重合,且能构成的三角形的个数不小于k
输出描述:
对于每一组样例,输出第k大三角形的面积,精确到小数点后两位(四舍五入)。
Tricky点:要使用nth_element来找出第k大的数,否则会tle
#include<cstdio>
#include<complex>
#include<algorithm>
#include<functional>
using namespace std;
using point=complex<long long>;
int T,n,k,x,y,sn;
point a[105];
long long s[1000005];
long long get_area(int p, int q, int r)
{
point t1=a[p]-a[q];
point t2=a[r]-a[q];
return abs((conj(t1)*t2).imag());
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n ;i++)
scanf("%d%d",&x,&y),a[i]=(point){x,y};
sn=0;
for(int i=1;i<= n -2;i++)
for(int j=i+1;j<=n -1;j++)
for(int k=j+1;k<=n;k++)
{
s[++sn]=get_area(i,j,k);
if(s[sn]==0)
--sn;
}
nth_element(s+1,s+k,s+sn+1,greater<long long>());
printf("%lld",s[k]>>1);
if(s[k]&1)
printf(".50
");
else
printf(".00
");
}
return 0;
}