Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

为何超时?

Posted by gemenhao at 2006-06-10 10:34:07 on Problem 2623
//利用快排折半查找,理论上比快排快不少.
//算法复杂度为0(2*n)

#include <algorithm>
#include <time.h>
using namespace std;

typedef unsigned int uint;

uint DC[250003];
int midpos;

void swap(int i, int j)
{
	uint temp = DC[i];
	DC[i] = DC[j];
	DC[j] = temp;
}

uint quickFind(int left, int right)
{
	if (left + 16 > right)
	{
		std::sort(DC + left, DC + right + 1);
		return DC[midpos];
	}
	int L = left + 1, R = right;
	swap(left, rand() % (R - L + 2) + left);
	uint pivot = DC[left];
	while ( true )
	{
		while (L < right && DC[L] <= pivot)
			L++;
		while (DC[R] > pivot)
			R--;
		if (L >= R)
			break;
		swap(L++, R--);
	}
	if (R > left)
		swap(left, R);
	if (R == midpos)
		return DC[R];
	else if (R > midpos)
		return quickFind(left, R - 1);
	else
		return quickFind(R + 1, right);
}

int main( )
{
	int n;
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
		scanf("%u",&DC[i]);
	midpos = n / 2 + 1;
	srand(time(0));
	uint mid2 = quickFind(1,n);
	if (n % 2 == 1)
		printf("%.1lf\n",(double)mid2);
	else
	{
		uint mid1 = quickFind(1, midpos--);
		/*uint mid1 = DC[1];
		for(int i = 1; i < midpos; i++)
		{
			if ( DC[i] <= mid2 && DC[i] >= mid1 )
				mid1 = DC[i];
		}*/
		printf("%.1lf\n",(mid1 + mid2)/2.0);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator