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;
}