算法学习之五家共井

来源:互联网 发布:mac ssh命令 端口 编辑:程序博客网 时间:2024/06/06 18:22

问题: 
五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。 
最后问:井有多深?每家的绳子各有多长? 
这道题其实不难,大家应该都可以做出来,和上次的百钱买百鸡的问题差不多,那就有人问了,那为什么还要写出来呢,当然是普通方法会让复杂度让人难以接受的,复杂度为O(n2),需要优化。

我们令甲为a,乙为b,丙为c,丁为d,戊为e,井深为h,则

    2a+b=h   ①    3b+c=h   ②    4c+d=h   ③    5d+e=h   ④    6e+a=h   ⑤

将其变形: 
b=h-2a ⑥

c=h-3b ⑦

d=h-4c ⑧

e=h-5d ⑨

a=h-6e ⑩ 
将⑥,⑧,⑨,⑩分别代入⑦,可得: 
c=(148/721)h 
令 h=721k,则 c=148k,将其代入⑥,⑦,⑧,⑨,⑩可得: 
a=265k

b=191k

c=148k

d=129k

e=76k

h=721k 
因为绳长和井深不可能为负,所以k > 0,当然这样这个题目就有无数个解的,我这里去 0 < k <4; 
代码为:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>; i++) {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">265</span> * i;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">191</span> * i;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> c = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">148</span> * i;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> d = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192</span> * i;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> e = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">76</span> * i;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">721</span> * i;            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"甲绳:"</span> + a + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"乙绳:"</span> + b + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"丙绳:"</span> + c + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"丁绳:"</span> + d + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"戊绳:"</span> + e + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"井深:"</span>  + h);        }    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

结果: 
这里写图片描述 
这样复杂度就变为0(n)了,在这样我把这种方法叫做“统一变量法”(即减少循环的次数),大家以后遇到类似的题目可以尝试下哦。。。。

0 0