处女座的签到题(求第k大个数

题目描述
平面上有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\n");
        else
            printf(".00\n");
    }
    return 0;
}
posted @ 2019-05-28 14:16  Potato!  阅读(147)  评论(0编辑  收藏  举报