nth_element()函数
头文件:#include<algorithm>
作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0開始计数的,也就是说求第0小的元素就是最小的数。
如:a[start,end]元素区间。排序后a[n]就是数列中第n+1大的数(下标从0開始计数)。要注意的是a[start,n),
a[n,end]内的大小顺序还不一定。
仅仅能确定a[n]是数列中第n+1大的数。
当然a[start,n)中的数肯定不大于
a[n,end]中的数。
注意:nth_element()函数不过将第n大的数排好了位置,并不返回值。
实例代码例如以下:
#include<iostream> #include<algorithm> using namespace std; int main() { int a[]={1,3,4,5,2,6,8,7,9}; int i; cout<<"数列例如以下:"<<endl; for(i=0;i<9;i++) cout<<a[i]<<" "; nth_element(a,a+5,a+9); cout<<endl<<"输出第五大的数: "<<a[4]<<endl; //注意下标是从0開始计数的 return 0; }
链接: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
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
long long x[120];
long long y[120];
vector<long double>v;
long double f(int i,int j,int k)
{
long double s=(long double)x[i]*y[j]+(long double)x[j]*y[k]+(long double)x[k]*y[i]-(long double)x[k]*y[j]-(long double)x[j]*y[i]-(long double)x[i]*y[k];
if (s<0) return -s;
return s;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
v.clear();
int n;
int k;
scanf("%d",&n);
scanf("%d",&k);
for (int i=1;i<=n;i++)scanf("%lld%lld",&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++)
{
v.push_back(f(i,j,k));
}
}
}
long long size=v.size();
nth_element(v.begin(),v.begin()+(int)(size-k),v.end());
long double ans=v[v.size()-k];
ans=ans/2.0;
printf("%.2llf\n",ans);
}
return 0;
}