// 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] = n; scanf("%lu%lu", &A[n], &B[n]); } 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[n]] > maxVal) { maxIndex = seq[n]; maxVal = B[seq[n]]; } } printf("%lu/n", maxIndex+1); return 0; } 使用随机化pilot竟然完全没有效率提升