頭文件:
#include<algorithm>
用法:
nth_element(a+l,a+l+k-1,a+r+1,cmp);
nth_element(a+l,a+l+k-1,a+r+1);
效果
將數組a,將區間l~r按cmp排序按值第k小的值放在l+k-1位置上。(如 1,1,3) 第一小的數是1,第二小的數是3.
排序後l~(l+k-2)的值都比a[l+k-1]小,(l+k) ~ r的都比a[l+k-1]大,但是不保證順序
原理
原理就是快排,時間複雜度O(n)
例題:處女座的簽到題
題意:輸出面積第k大的三角形:
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
long double x[1000010],y[1000010];
bool cmp(long double a,long double b){
return a-b>eps; //降序排序
}
long double a[1000010];
long double area(int i,int j,int k){
return 0.5*abs(x[i]*y[j]+x[j]*y[k]+x[k]*y[i]-x[i]*y[k]-x[j]*y[i]-x[k]*y[j]);
}
int main(){
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>x[i]>>y[i];
}
int cnt=0;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
for(int k=j+1;k<=n;++k){
a[++cnt]=area(i,j,k);
}
}
}
int l=1,r=cnt;
nth_element(a+l,a + k+l-1 ,a + r+1,cmp);
printf("%.2LF\n",a[k+l-1]);
}
return 0;
}