防水堤坝问题

来源:互联网 发布:netty nginx 编辑:程序博客网 时间:2024/04/27 15:56

Description 
在太平洋的一个小岛上,岛民想要建立一个环岛的堤坝,我们可以将小岛简化为一个二维平面,你需要使用K条边(这些边要么是水平或者垂直长度为1的边,要么是45度倾斜的长度为√2的边)围成一个多边形,多边形的顶点必须位于整点,然后要让围成的多边形面积最大,你需要求出最大面积是多少。

Input 
输入包含多个测试实例,每组实例给出一个数K。(3≤K≤2000000000)

Output 
每一行对应一个要求的答案。(保留一位小数)

Sample Input 



6

Sample Output 
0.5 
2.0 
2.5 
4.0

可以画图推导公式。首先无论拼出来的是什么多边形都可以划分成三角形,最基本的元(3条边构成的三角形)的面积是1*1*0.5=0.5。随着边数增加,有以下规律:

 边数k           3  4  5  6  7  8三角形个数        1  4  5  8  9  12

(k-3)/2=a……b(b为余数)

  1. 若b=0,则面积S=(1+4a)0.5
  2. 若b!=0,则面积S=(1+4a+3)0.5
<code class="hljs perl 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-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#include <stdio.h></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc, char <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*argv</span>[]){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>边数    <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;">0</span>;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>商     <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;">0</span>;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>余数    float <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">s</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>面积     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(scanf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">%d</span>"</span>, &k) != EOF){        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(k<<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> || k><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2000000000</span>)            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;        a = (k-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;        b = (k-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">%2</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(b == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">s</span> = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+a<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*4</span>)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">s</span> = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*a</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">%0</span>.1f\n"</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">s</span>);    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;}</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-width: 1px; border-right-style: solid; border-right-color: 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><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>

这是我的一个解决办法,公式并未经过严格证明。若有错误请指正,谢谢! 
转载请注明出处!

0 0
原创粉丝点击