链接:https://ac.nowcoder.com/acm/contest/327/A
来源:牛客网
题目描述
平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多少?
输入描述:
第一行T,表示样例的个数。 对于每一组样例,第一行两个整数n和k, 接下来n行,每行两个整数x,y表示点的坐标 T<=80
3<=n<=100
-109<=x,y<=109
对于每一组样例,保证任意两点不重合,且能构成的三角形的个数不小于k
输出描述:
对于每一组样例,输出第k大三角形的面积,精确到小数点后两位(四舍五入)。
示例1
输入
复制
1 4 3 1 1 0 0 0 1 0 -1
输出
复制
0.50
说明
样例中一共能构成3个三角形,面积分别为0.5,0.5,和1,面积第3大的为0.5
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
long long x[120];
long long y[120];
vector<long double>v;
long double f(int i,int j,int k)
{
long double s=(long double)x[i]*y[j]+(long double)x[j]*y[k]+(long double)x[k]*y[i]-(long double)x[k]*y[j]-(long double)x[j]*y[i]-(long double)x[i]*y[k];
if (s<0) return -s;
return s;
}//求面积
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
v.clear();
int n;
int k;
scanf("%d",&n);
scanf("%d",&k);
for (int i=1; i<=n; i++)scanf("%lld%lld",&x[i],&y[i]);
for (int i=1; i<=n; i++)
{
for (int j=i+1; j<=n; j++)
{
for (int k=j+1; k<=n; k++)
{
v.push_back(f(i,j,k));
}
}
}//求面积
long long size=v.size();
nth_element(v.begin(),v.begin()+(int)(size-k),v.end());//第k大
long double ans=v[v.size()-k];//固定第k大的数;
ans=ans/2.0;
printf("%.2llf\n",ans);
}
return 0;
}