Cuboid route

A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the opposite corner. By travelling on the surfaces of the room the shortest “straight line” distance from S to F is 10 and the path is shown on the diagram.

However, there are up to three “shortest” path candidates for any given cuboid and the shortest route doesn’t always have integer length.

It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is 1975.

Find the least value of M such that the number of solutions first exceeds one million.


长方体路径

蜘蛛S位于一个6乘5乘3大小的长方体屋子的一角,而苍蝇F则恰好位于其对角。沿着屋子的表面,从S到F的最短“直线”距离是10,路径如下图所示:

但是,每个立方体都有三条可能的最短路径,而且最终的最短路径并不一定是整数。

考虑所有整数边长的立方体屋子,最大不超过M×M×M,当M=100时一共有2060个立方体的最短路径是整数,而且这也是解超过2000的最小的M;M=99时又1975个立方体的最短路径是整数。

找出解超过一百万的最小的M。

解题

可以直接求的

为了防止在计算的过程中,出现立方体重复的显现,可以假设 a<=b <=c

最短路径有三种:

path1 = (a+b)^2 + c^2

path2 = (a+c)^2 + b^2

path3 = (c+b)^2 + a^2

上面三个值展开后可以发现都含有a b c的平方项,不同项以此是:2ab 2 ac 2bc

显然的发现2ab是最小值,也就是说path1就是最小路径值,判断是不是整数就很简单了。

Java关键程序

    static void run(){
int limit = 1000000;
int count =0;
int M = 1;
for(M = 1;;M++){
// 当 a<= b <= c 最小路径就是 (a+b)*(a+b) + c*c 开根号
for(int a = 1;a<= M ;a++){
for(int b =a ;b<= M;b++){
int c = M ;
int path = (a+b)*(a+b) + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp == path){
count ++;
}
}
}
if(count> limit){
System.out.println(M);
break;
}
}
}

另外一种方法,参考链接

同样假设:a<=b<=c

最小值是:(a+b)^2 + c^2

可以把 a+b看成一个值ab

显然ab的范围就是[2,2M]

后面就看不懂了。

上面两种放大都是固定c的值,c也是最大值,找出对应c满足条件的 立方体数量,c+1的时候显然是包括c的情况的解。

package Level3;

public class PE086{
static void run(){
int limit = 1000000;
int count =0;
int M = 1;
for(M = 1;;M++){
// 当 a<= b <= c 最小路径就是 (a+b)*(a+b) + c*c 开根号
for(int a = 1;a<= M ;a++){
for(int b =a ;b<= M;b++){
int c = M ;
int path = (a+b)*(a+b) + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp == path){
count ++;
}
}
}
if(count> limit){
System.out.println(M);
break;
}
}
}
static void run2() {
int limit = 1000000; int c = 1;
int count = 0;
while(count < limit){
c++;
for(int ab = 2;ab<= 2*c;ab++){
int path = ab*ab + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp== path){
count += (ab>=c)?1+(c-(ab+1)/2):ab/2;
}
}
// if(c ==100)
// System.out.println(count);
}
System.out.println(c);
} public static void main(String[] args){
long t0 = System.currentTimeMillis();
run2();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}

1818
running time=0s39ms

 

Python 时间有点长

# coding=gbk
import time as time t0 = time.time()
print 3**2
print int(8**0.5)
def run():
limit = 1000000
count = 0
M = 1
while count < limit:
for a in range(1,M+1):
for b in range(a,M+1):
c = M
path = (a+b)**2 + c**2
tmp = int((path)**0.5)
if tmp**2 == path:
count +=1
M += 1 print M-1 # 1818
# running time= 1062.27400017 s run()
t1 = time.time()
print "running time=",(t1-t0),"s"

Project Euler 86:Cuboid route 长方体路径的更多相关文章

  1. Project Euler:Problem 86 Cuboid route

    A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the o ...

  2. Project Euler 126 - Cuboid layers

    这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...

  3. Python练习题 043:Project Euler 015:方格路径

    本题来自 Project Euler 第15题:https://projecteuler.net/problem=15 ''' Project Euler: Problem 15: Lattice p ...

  4. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  5. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  6. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  7. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  8. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  9. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

随机推荐

  1. Ubuntu 14.04下java开发环境的搭建--3--Tomcat及MySQL的安装

    前面两篇文章,已经说明了JDK和Eclipse 的安装方法,下面简单说一下,Tomcat及MySQL的安装方法. Tomcat的安装. 在合适的地方解压apache-tomcat-6.0.39.tar ...

  2. Eclispe使用Maven添加官方库的jar包

    先到百度或google搜索maven仓库,在仓库中搜索需要的jar包,如poi.jar. 搜索到之后找到需要的jar包,找到这里

  3. 【转】AOP知识点

    ref:http://www.diybloghome.com/prology/975.html 一.概念理解 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming, ...

  4. 基于WORDPRESS+MYSQL的绿色企业主题制作全过程

    基于WORDPRESS+MYSQL的绿色企业主题制作全过程基于WORDPRESS+MYSQL的绿色企业主题制作全过程基于WORDPRESS+MYSQL的绿色企业主题制作全过程基于WORDPRESS+M ...

  5. Ubuntu16.04.1 安装MyCat

    Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统. 安装Java环境,配置全局环境变量 MyCAT是使用JAV ...

  6. lighttpd的超时参数详解

    今天服务器上传大文件,服务器php一直没有响应,响应为0KB,经排查发现是lighttpd的超时设置问题 server.max-keep-alive-idle = 5server.max-read-i ...

  7. jquery数组之存放checkbox全选值示例代码

    使用jquery数组可以存放checkbox全选值,下面有个不错的示例,感兴趣的朋友可以参考下. 复制代码代码如下: <input type="checkbox" id=&q ...

  8. 【转】Eazfuscator.NET 3.3中混淆化需要注意的一些问题

    对于DLL,Eazfuscator.NET默认不会混淆化任何公共成员,因为类库的公共成员很有可能被外界调用,而对于EXE的程序集,所有类型都可能被混淆化.注意上面这句话有一个“可能”,因为Eazfus ...

  9. 你的数据根本不够大,别老扯什么Hadoop了

    本文原名"Don't use Hadoop when your data isn't that big ",出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯 ...

  10. orcale 修改字段属性

    有些时候,因为没能预料到一些情况的变化,需要修改字段的类型.如果是varchar型,直接增加长度是可以的,但是如果需要修改成其他类型就不能这么做了. 思路:1.增加一个临时列,把需要修改的那个字段的数 ...