链接: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
STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。
已知三个点的坐标求三角形面积公式:(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int MAX=1e3+5;
struct Node
{
ll x;
ll y;
}a[MAX];
int main()
{
int T;
// cin >> T;
scanf("%d",&T);
while(T--){
int n, k;
// cin >> n >> k;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++){
// cin >> a[i].x >> a[i].y;
scanf("%lld%lld",&a[i].x,&a[i].y);
}
vector<ll> v;
ll area;
for(int i = 1; i <= n; i++){ //求所有三角形面积,放在容器中
for(int j = i + 1; j <= n; j++){
for(int l = j + 1; l <= n; l++){
area = abs((a[j].x - a[i].x) * (a[l].y - a[i].y) - (a[l].x - a[i].x) * (a[j].y - a[i].y));
v.push_back(area);
}
}
}
nth_element(v.begin(), v.begin() + v.size() - k, v.end());
ll ans = v[v.size() - k];
if((ans & 1 )== 0){ //一定要加括号!
printf("%lld.00\n", ans/2); //这一种输出方式可以学习
}
else{
printf("%lld.50\n", ans/2);
}
}
return 0;
}