这道题我是自己写的二分查找加Java的BigInteger做的。看了后面打表的做法,大整数似乎是不需要的,int就足够了。
实际上二分查找维护一个排序的数组就是priority queue的主要作用,用STL可以大大简化过程。
基于以上两点,时间很慢。如果思路不变,但用STL+int,discuss上面有0ms的。
最聪明的做法应该是这样的:
http://poj.org/showmessage?message_id=113667
维护3个指针齐头并进,i2_mul指向可以乘2的最小的数(换句话说比这个数大的数就没必要试试乘2了)。其他两个变量同理。谁选上了(最小),谁更新下(++)。
thestoryofsnow | 1338 | Accepted | 6280K | 282MS | Java | 2004B |
import java.io.*;
import java.util.*;
import java.math.BigInteger;
public class Poj1338 {
public static void main(String args[])
{
final int MAXN = 1500;
final BigInteger TWO = BigInteger.valueOf(2);
final BigInteger THREE = BigInteger.valueOf(3);
final BigInteger FIVE = BigInteger.valueOf(5);
final BigInteger[] BASE = new BigInteger[3];
BASE[0] = TWO; BASE[1] = THREE; BASE[2] = FIVE;
BigInteger[][] powers = new BigInteger[3][MAXN];
for (int i = 0; i < 3; ++i)
{
powers[i][0] = BigInteger.ONE;
for (int n = 1; n < MAXN; ++n)
{
powers[i][n] = powers[i][n - 1].multiply(BASE[i]);
// if (n < 5)
// {
// System.out.println("powers[" + i + "][" + n + "]: " + powers[i][n]);
// }
}
}
BigInteger[] nums = new BigInteger[MAXN];
int nnums = 0;
int low, high, mid;
for (int x = 0; x < MAXN; ++x)
{
for (int y = 0; (1 + x) * (1 + y) <= MAXN; ++y)
{
for (int z = 0; (1 + x) * (1 + y) * (1 + z) <= MAXN; ++z)
{
BigInteger num = powers[0][x].multiply(powers[1][y]).multiply(powers[2][z]);
low = 0; high = nnums - 1;
while (low <= high)
{
mid = low + (high - low) / 2;
if (nums[mid].compareTo(num) <= 0)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
if (low == MAXN)
{
continue;
}
else
{
if (nnums < MAXN)
{
nnums++;
}
for (int i = nnums - 1; i >= low + 1; --i)
{
nums[i] = nums[i - 1];
}
nums[low] = num;
}
}
}
}
// Collections.sort(nums);
// for (int i = 0; i < 10; ++i)
// {
// System.out.print(nums[i] + " ");
// }
// System.out.println();
Scanner cin = new Scanner(System.in);
Integer n;
while (cin.hasNext())
{
n = cin.nextInt();
if (n == 0)
{
break;
}
System.out.println(nums[n - 1]);
}
}
}