soj 3102 不明白

ACCCCC
 
 
#include<stdio.h>  
#include<time.h>  
#include<stdlib.h>  
#define MAX 2000001
inline int GetDiviedPosition(int* piScr,int iStartIndex,int iEndIndex)    
{    
    int iTemp = 0;    
    int iPos = iStartIndex;    
    int iPosValue = piScr[iPos];    
    int iLeftIndex = iPos ;    
    int iRightIndex = iEndIndex + 1;    
    while(true)    
    {    
        while(iLeftIndex < iEndIndex && piScr[++iLeftIndex] >iPosValue)    
        {    
 
        }    
        while(piScr[--iRightIndex] < iPosValue)    
        {    
  
        }             
        if(iLeftIndex >= iRightIndex)    
        {    
            break;    
        }        
        else    
        {    
            iTemp = piScr[iLeftIndex];    
            piScr[iLeftIndex] = piScr[iRightIndex];    
            piScr[iRightIndex] = iTemp;     
        }        
    }    
    // swap piScr[iRightIndex] and piScr[iPos]  return the pos iRightIndex     
    piScr[iPos] = piScr[iRightIndex];    
    piScr[iRightIndex] = iPosValue;    
    return iRightIndex;     
}     
inline int GetPosRandom(int* piScr,int iStartIndex ,int iEndIndex)    
{    
    //generate a number between [iStartIndex,iEndIndex];    
    srand(time(NULL)); // seed the random-number generator with the current time     
    int iRand =(int)( ((double)rand()/(double)RAND_MAX )* (iEndIndex-iStartIndex))  + iStartIndex;     
    int iTemp = 0;   
    iTemp = piScr[iStartIndex];    
    piScr[iStartIndex] = piScr[iRand];    
    piScr[iRand] = iTemp;    
    return GetDiviedPosition(piScr,iStartIndex,iEndIndex);   
}       
int GetInputTh(int* piInt,int iStartIndex,int iEndIndex,int iInput)    
{    
    if(iStartIndex < iEndIndex)    
    {    

        int iPos = GetPosRandom( piInt,iStartIndex,iEndIndex);   
        if(iPos  + iInput - 1 == iEndIndex)    
        {    

            return piInt[iPos];    
        }        
        else if(iPos  < iEndIndex - iInput + 1) //right    
        {    
            GetInputTh(piInt,iPos + 1,iEndIndex,iInput);    
        }            
        else //left    
        {    
            GetInputTh(piInt,iStartIndex,iPos -1,iInput - (iEndIndex - (iPos -1)));  // 10 5 10   
        }    
    }     
    else  
        return piInt[iEndIndex];  

}    
int a[MAX];

char s[MAX*9];

int main(void)
{
    int n,k;
    while(scanf("%d%d",&n,&k)==2)
    {
        int i=0,t=0,j=1;
        getchar();
        gets(s);
        while(s[i]!='\0')
        {
            if(s[i]==' ')
            {
                a[j++]=t;
                t=0;
                i++;
                continue;
            }
            t*=10;
            t+=s[i]-'0';
            i++;
        }
        a[j]=t;    
        printf("%d\n",GetInputTh(a,1,n,k));
    }
    return 0;
}  

 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
/*
using namespace std;
int GetPos(int* piScr,int iStartIndex,int iEndIndex) 

    int iPos = iStartIndex; 
    int iLeftIndex = iStartIndex ; 
    int iRightIndex = iEndIndex + 1; 
    int iPosValue = piScr[iPos]; 
    int iTemp = 0; 
    while(true) 
    { 
        while(piScr[++iLeftIndex] < iPosValue && iLeftIndex < iEndIndex) 
        { 

        }     
        while(piScr[--iRightIndex] > iPosValue) 
        { 

        } 
        if(iRightIndex <= iLeftIndex) 
        { 
            break; 
        } 
        else 
        { 
            iTemp = piScr[iLeftIndex]; 
            piScr[iLeftIndex] = piScr[iRightIndex]; 
            piScr[iRightIndex] = iTemp; 
        }             
    }   
    iTemp = piScr[iRightIndex]; 
    piScr[iRightIndex] = iPosValue; 
    piScr[iPos] = iTemp; 
    return iRightIndex;   
}     
int GetPosRandom(int* piScr,int iStartIndex ,int iEndIndex) 

    //generate a number between [iStartIndex,iEndIndex]; 
    srand(time(NULL)); // seed the random-number generator with the current time  
   // int iRand =(int) ((double)rand()/(double)RAND_MAX )* iEndIndex  + iStartIndex;
    int iRand = rand() % (iEndIndex -iStartIndex) + iStartIndex + 1;
    int iTemp = 0; 
    iTemp = piScr[iStartIndex]; 
    piScr[iStartIndex] = piScr[iRand]; 
    piScr[iRand] = iTemp; 
    return GetPos(piScr,iStartIndex,iEndIndex); 
}*/
void exchange(int arr[],int i, int j) //交换数组两元素值

{

    int temp;

    temp  =arr[i];

    arr[i]=arr[j];

    arr[j]=temp;

    return;

 

}

int partition(int arraydest[],int p,int r) //未使用随机数的划分函数

{

    int contra=arraydest[r];

    int i=p-1;

    int j=p;

    for(;j<=r-1;j++)

    {

        if(arraydest[j]<contra)

        {

            i=i+1;

            exchange(arraydest,i,j);

        }

    }

    exchange(arraydest,i+1,r);

    return i+1;

}

 

 

int random_partition(int arr[],int p,int r)//使用随机数的改进划分函数、

{                             //改进划分函数可以使上面的传统划分函数完整独立,不用更改代码

 

    int i=rand()%(r-p)+p+1;          //这里是在【p,r】之间随机出一个下标值i

    exchange(arr,i,r);                //让i和r交换值

    return partition(arr, p, r);      //不使用末值arr【r】做划分点,而是随机化选择划分点。

 

}

 


int select(int arr[], int lw, int hi, int k)
// lw:下标下界, hi:下标上届。
{
    if(lw==hi)
        return arr[lw];
    int q = random_partition(arr,lw,hi);//调用quicksort里面的partition, q指向参考数
    int l = q-lw+1;  // l为左数组长度
    if(k==l)
        return arr[q];
    if(k<l)
        return select(arr,lw,q-1,k);
    if(k>l)
        return select(arr,q+1,hi,k-l);
}
int aiTest[2000000+100];
char aiChr[2000000*20];
char inputs[100];
int main()   
{   

    int iInput = 0; int n =0;    
    int i =0;
    int size =0;
    char* data;
    while(true)   
    { 
      
           gets(inputs);
           if(2==sscanf(inputs,"%d %d",&n,&iInput))
           {
             
               gets(aiChr);
               i =0;
               data = aiChr;
               while(i < n)
               {
                   sscanf(data,"%d%n",&aiTest[i++],&size);
                   data = data + size;

               }
               int num = select(aiTest,0,n-1, iInput);   
               printf("%d\n",num);
           }

          else
              break;

    }           
    return 0;
}    

你可能感兴趣的:(soj 3102 不明白)