我想了个不太高明的:
首先,能量消耗是 X,2X,4X,8X
消灭敌人所消耗的能量根据题目给出的进行一个排序获得最大值MAX
此时X的值从MAX到MIN最小值遍历,计算出消耗能量值,取最小值。(需要使用递归计算X,2X,4X的值是否大于选择X)一个for语句(J=1至MAX)
{
容器Enemy; //存储敌人的数量和消耗能量的结构体容器
for(Enemy的每个值E)
{
Y=1; //Y的值决定,1,2,4,8,16
flag = TRUE;
While(flag)
{
if(J*E*Y < 当前E)
{
Y*2;
}
else
{
flag = FALSE;
} //计算浪费能量
}
}
}写得比较粗,可能还有问题,大致思路讲了下。感觉肯定能优化,等大师来解答吧
首先,能量消耗是 X,2X,4X,8X
消灭敌人所消耗的能量根据题目给出的进行一个排序获得最大值MAX
此时X的值从MAX到MIN最小值遍历,计算出消耗能量值,取最小值。(需要使用递归计算X,2X,4X的值是否大于选择X)一个for语句(J=1至MAX)
{
容器Enemy; //存储敌人的数量和消耗能量的结构体容器
for(Enemy的每个值E)
{
Y=1; //Y的值决定,1,2,4,8,16
flag = TRUE;
While(flag)
{
if(J*E*Y < 当前E)
{
Y*2;
}
else
{
flag = FALSE;
} //计算浪费能量
}
}
}写得比较粗,可能还有问题,大致思路讲了下。感觉肯定能优化,等大师来解答吧
对于素数3:,形成表:3、6、12、……
对于素数5,形成表:5、10、20、……
对于素数7,形成表:7、14、28、……对于示例1,(7、31),我们遍历以上表,每个数取表里比他大的那个数去相减,得出
素数2的表 sum= (8-7) + (32-31) = 2
素数3的表 sum=(12-7) + (48-31) = 22
……所以最小值为2
算法复杂度其实大概是 O(n logm),还有很多地方可以优化。
希望能有高手帮助解决。
如果初值选择2,那么4 8 16 32 都是等价的
如果初值选择3,那么2 5 8 11 都是等价的
这样的话是不是可以把循环次数减少?
这个数量级我觉得我的算法也非常轻而易举。有OJ上有这道题么?不是哪个OJ上的,是一个国外的朋友问的。
我尝试预先生成了一个奇数倍增表,如果是百万级别的,那么这个表就有50万行。
你觉得1秒完成的把握大吗?有什么精神我还没有领会呢?