链接: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
思路:这个题目下来之后,就是懵逼,有一个直接找的函数nth_element我都不知道,用的sort是过不了的,其中那个精度的设置我倒是想到了。很难受
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define maxn 170000
using namespace std;
bool cmp(ll a,ll b)
{
return a>b;
}
ll n,K;
ll x[110],y[110];
ll a[maxn];
int main()
{
int t;scanf("%d",&t);
while(t--)
{
int cnt=0;
scanf("%d%d",&n,&K);
for(int i=1;i<=n;i++)
{
cin>>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++)
{
a[cnt++]=abs(x[i]*y[j]+x[j]*y[k]+x[k]*y[i]-x[i]*y[k]-x[j]*y[i]-x[k]*y[j]);
}
}
}
nth_element(a,a+cnt-K,a+cnt);
printf("%lld",a[cnt-K]/2);
if(a[cnt-K]%2) cout<<".50"<<endl;
else cout<<".00"<<endl;
}
}