牛客寒假算法集訓營2 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。

解題分析

用三重循環求出所有的三角形的面積儲存在一個數組裏,排序後輸出第k個的大小

AC代碼

#include<bits/stdc++.h>
using namespace std;
#define LL long long
typedef struct
{
    LL x,y;
} node;
node t[10000];
LL s[10000050];
bool cmp(LL a,LL b){
    return a>b;
}
int main()
{
    int i,j,x,n,k;
    int F;
    scanf("%d",&F);
    while(F--)
    {
        scanf("%d%d",&n,&k);
        for(i=0; i<n; i++)
            scanf("%lld%lld",&(t[i].x),&(t[i].y));
        LL index=0;
        for(i=0; i<n; i++)
        {
            for(j=i+1; j<n; j++)
            {
                for(x=j+1; x<n; x++)
                {
                        s[index++]=abs((t[i].x-t[j].x)*(t[x].y-t[j].y)-(t[i].y-t[j].y)*(t[x].x-t[j].x));
                }
            }
        }
        nth_element(s,s+k-1,s+index,cmp);
        printf("%lld",s[k-1]/2);
        printf(s[k-1]&1?".50\n":".00\n");
    }
    return 0;
}

在這之前還有一個相同思路的代碼,不過不知道爲什麼本地能運行放到牛客上顯示編譯錯誤T^T菜是原罪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章