您的位置:首页 > 其它

pku3664 Election Time

2009-03-31 00:22 225 查看
// pku3664 Election Time
#include <cstdio>
#include <ctime>
#include <cstdlib>

#define MAX_NUM		50000
//#define MAX_NUM	10

typedef unsigned short UINT16;
typedef long INT32;
typedef unsigned long UINT32;

UINT32 N, K;

UINT32 A[MAX_NUM];
UINT32 B[MAX_NUM];
UINT16 seq[MAX_NUM];

inline void exchange(UINT32 i, UINT32 j)
{
if (i != j)
{
UINT16 tmp = seq[i];
seq[i] = seq[j];
seq[j] = tmp;
}
}

UINT32 partition(UINT32 begin, UINT32 end)
{
if (begin >= end)
return begin;

UINT32 iPilot = begin + rand()%(end-begin+1);
exchange(begin, iPilot);

UINT32 i=begin+1, j=end;
UINT32 pilot = A[seq[begin]];

while (i < j)
{
while (i<j && A[seq[i]] >= pilot)
i++;
while (i<j && A[seq[j]] <= pilot)
j--;
exchange(i, j);
}

UINT32 mid;
if (pilot < A[seq[i]])
mid = i;
else
mid = i-1;
exchange(begin, mid);
return mid;
}

int main()
{
srand( (unsigned)time(NULL) );

scanf("%lu%lu", &N, &K);
UINT16 n;
for (n=0; n<N; n++)
{
seq
= n;
scanf("%lu%lu", &A
, &B
);
}

if (1 == N)
{
printf("%lu/n", 1);
return 0;
}

UINT32 begin = 0, end = N-1;
UINT32 mid = partition(begin, end);
while (mid != K)
{
if (mid < K)
{
begin = mid+1;
mid = partition(begin, end);
}
else // (mid > K)
{
end = mid-1;
mid = partition(begin, end);
}
}

UINT32 maxIndex, maxVal=0;
for (n=0; n<K; n++)
{
if (B[seq
] > maxVal)
{
maxIndex = seq
;
maxVal = B[seq
];
}
}
printf("%lu/n", maxIndex+1);

return 0;
}


使用随机化pilot竟然完全没有效率提升
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: