1. 程式人生 > >nth_element函數

nth_element函數

view itl col open scan namespace 元素 nbsp -s

使用方法:nth_element(start, start+n, end)

使第n大元素處於第n位置(從0開始,其位置是下標為n的元素),並且比這個元素小的元素都排在這個元素之前,比這個元素大的元素都排在這個元素之後,但不能保證他們是有序的。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=101;
char s[N];
int main()
{
    
int len,n; gets(s); len=strlen(s); scanf("%d",&n); nth_element(s,s+n,s+len); puts(s); return 0; }

nth_element函數原型有四個,詳細我就不一一累贅了,我們就用最普通的用法尋找第k位置的元素。

函數用法為:nth_element(first,kth,end)。

first,last 第一個和最後一個叠代器,也可以直接用數組的位置。
kth,要定位的第k個元素,能對它進行隨機訪問.

將第k_th元素放到它該放的位置上,左邊元素都小於等於它,右邊元素都大於等於它.

例如:

vector<int> a(9);
for(int i = 0; i < 9; i++)
a[i] = i+1;
random_shuffle(a.begin(),a.end());
for(int i = 0; i < 9; i++)
cout << a[i] << " ";
cout << endl;

nth_element(a.begin(),a.begin()+4,a.end());
cout << *(a.begin()+4) << endl;

for(int i = 0; i < 9; i++)

cout << a[i] << " ";

cout << endl;

結果為:

技術分享圖片

可以發現函數只是把kth的元素放在了正確位置,對其他元素並沒有排序,所以可以利用這個函數快速定位第k個元素,當然,這個函數也支持你直接寫比較函數,此處不再累贅因為ACM中基本不會用到。

那麽為什麽要選擇這個函數呢,這就和復雜度有關了,nth_element的空間復雜度為O(1),在數據量大的時候時間復雜度為O(n),數據少的情況最壞為O(n^2),因為函數原理是隨機訪問,但實際運用過程中,基本都會是O(n)的時間復雜度。所以說是非常迅速的。

https://ac.nowcoder.com/acm/contest/327/A

技術分享圖片
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int t,n,k;
struct point
{
    ll x,y;
} a[105];
 
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&n,&k);
        for (int i=1; i<=n; i++)
        {
            scanf("%lld%lld",&a[i].x,&a[i].y);
        }
        vector<ll> v;
        for (int i=1; i<=n; i++)
        {
            for (int j=i+1; j<=n; j++)
            {
                for (int w=j+1; w<=n; w++)
                {
                    ll area=abs((a[j].x-a[i].x)*(a[w].y-a[i].y)-(a[w].x-a[i].x)*(a[j].y-a[i].y));
                    v.push_back(area);
                }
            }
        }
        nth_element(v.begin(),v.begin()+n*(n-1)*(n-2)/6-k,v.end());
        ll ans=v[n*(n-1)*(n-2)/6-k];
        if (ans%2==0) printf("%lld.00\n",ans/2);
        else printf("%lld.50\n",ans/2);
    }
    return 0;
}
View Code

nth_element函數