POJ 2388-Who's in the Middle

来源:互联网 发布:单片机课程 编辑:程序博客网 时间:2024/05/16 05:21
  • 中位数,参考算法导论

#include<cstdio>#include<cstdlib>using namespace std;#define maxN 10001int milk[maxN];int swap(int &x,int &y){    x ^= y;    y ^= x;    x ^= y;    return 1;}short partition(short start,short dest){    short i;    i = rand()%(dest-start)+start;    swap(milk[i],milk[dest]);    int tmpMed = milk[dest];    short medPos = start-1;                 //下标小于等于medPos的都小于等于tmpMed    for(i = start;i <= dest-1;i++)    {        if(milk[i] <= tmpMed)        {            medPos++;            if(medPos != i)            swap(milk[i],milk[medPos]);        }    }    medPos++;    if(medPos != dest)    swap(milk[dest],milk[medPos]);    return medPos;}int select(short start,short dest,short dest_mid){    if(start == dest)        return milk[start];    short med = partition(start,dest);    short k = med-start+1;    if(k == dest_mid)        return milk[med];    else if(dest_mid < k)        return select(start,med-1,dest_mid);    else        return select(med+1,dest,dest_mid-k);}int main(){    short i,N;    while(scanf("%hd",&N)!=EOF)    {    for(i = 0;i < N;i++)        scanf("%d",milk+i);    printf("%d\n",select(0,N-1,N/2+1));    }    return 0;}


0 0
原创粉丝点击