題目
平面上有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菜是原罪