随机 WA #1 求助
查看原帖
随机 WA #1 求助
998662
xk2013楼主2024/3/24 13:36
#include <cstdio>
#include <cstdlib>
#include <ctime>

int ans, n, k, *a;

void findkth(int l, int r);

int main(void)
{
	srand(time(NULL));
	scanf("%d%d", &n, &k);
	a = new int[n];
	
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	
	findkth(0, n - 1);
	printf("%d", ans);
}

void findkth(int l, int r)
{
	if (l == r)
	{
		ans = a[l];
		return;
	}
	
	int i = l, j = r, flag = a[rand() % (r - l) + l];
	
	do
	{
		while (a[i] < flag)
		{
			i++;
		}
		
		while (a[j] > flag)
		{
			j--;
		}
		
		if (i <= j)
		{
			a[i] ^= a[j];
			a[j] ^= a[i];
			a[i] ^= a[j];
			
			i++;
			j--;
		}
	}
	while (i <= j);
	
	if (k <= j)
	{
		findkth(l, j);
	}
	else if (i <= k)
	{
		findkth(i, r);
	}
	else
	{
		findkth(j + 1, i - 1);
	}
}
2024/3/24 13:36
加载中...