HCL 发表于 2007-6-17 10:32

<P>第五题那个我是用VC6.0写的,对于<FONT color=#ff0000><U>正整数</U></FONT>都可以,没有考虑其他的![em01]</P>

HCL 发表于 2007-6-17 10:33

希望此贴可以长期存在,并把已经完成的题放在楼顶作个标记嘛~谢谢![em02]

aipb2007 发表于 2007-6-17 10:42

放了!呵呵~~~~~~~~

simonray 发表于 2007-6-17 11:08

<P>新手...有点看不懂.</P>

aipb2007 发表于 2007-6-17 11:19

大家讨论下16题最少称几次啊?<br>------------------------------------------------------------------<br><br>16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。<br>真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的<br>比较次数挑出伪造硬币,并鉴定它是重还是轻。<br><br>------------------------------------------------------------------<br>我用4次似乎多了!

HCL 发表于 2007-6-17 12:55

<P>仿佛是第六题吧!帮忙看一下,如果有冗余的地方还望多提点一下[em01]<BR>希望看起不会太痛苦!    --VC6.0<BR>#include &lt;iostream&gt;<BR>#include &lt;iomanip&gt;<BR>#include &lt;vector&gt;</P>
<P>using namespace std;</P>
<P>int main()<BR>{<BR>    cout &lt;&lt;"Enter a number : ";<BR>    int  number;<BR>    cin  &gt;&gt;number;<BR>    int total = number * number;<BR>    int i = 0;<BR>    int j = 0;<BR>     //(1):<BR>        for (i = 0 ; i &lt; number ; ++i)<BR>        {<BR>            for (j = 0 ; j &lt; number ; ++j)<BR>            {<BR>                cout &lt;&lt;setw(5)&lt;&lt;total;<BR>                total -= 1;<BR>            }<BR>            cout &lt;&lt;endl;<BR>        }<BR>        cout &lt;&lt;endl;</P>
<P>    //(2)<BR>    i = 0;<BR>    j = 0;<BR>    int num = 1;<BR>    vector&lt; vector&lt;int&gt; &gt; a;<BR>    a.resize(number);<BR>    for (int x = 0; x &lt; number; ++x)<BR>        a[x].resize(number);<BR>    while(num &lt;= number * number)<BR>    {<BR>        if(i == 0 || j == number)<BR>        {<BR>            if(j == number){<BR>                i+=1;<BR>                j--;<BR>            }<BR>            for(; j &gt;= 0 &amp;&amp; i != number; --j){<BR>                a[i][j] = num;<BR>                num++;<BR>                i++;<BR>            }<BR>            ++j;<BR>        }<BR>        else if (j == 0 || i == number)<BR>        {<BR>            if (i == number){<BR>                j+=1;<BR>                i--;<BR>            }<BR>            for(; i &gt;= 0 &amp;&amp; j != number; --i){<BR>                a[i][j] = num;<BR>                num++;<BR>                j++;<BR>            }<BR>            ++i;<BR>        }<BR>        <BR>    }<BR>    for ( i = 0 ; i &lt; number ; ++i)<BR>    {<BR>        for (int j = 0 ; j &lt; number ; ++j)<BR>            cout &lt;&lt;setw(5)&lt;&lt;a[i][j];<BR>        cout &lt;&lt;endl;<BR>    }<BR>    cout &lt;&lt;endl;</P>

HCL 发表于 2007-6-17 12:55

<P>//(3)<BR>    i = 0;<BR>    j = 0;<BR>    num = 0;<BR>    vector&lt; vector&lt;int&gt; &gt; b;<BR>    b.resize(number);<BR>    for (int y = 0; y &lt; number; ++y)<BR>        b[y].resize(number);<BR>    int temp1 = 0;<BR>    int temp2 = number - 1;<BR>    for (int t = 0; t &lt;= number/2; t++, temp1++,temp2--,++i,++j) <BR>    {<BR>        for(i = temp1; i &lt; temp2; i++)<BR>            b[i][j] = ++num;<BR>        for(j = temp1; j &lt; temp2; j++)<BR>            b[i][j] = ++num;<BR>        for(i = temp2; i &gt; temp1; i--)<BR>            b[i][j] = ++num;<BR>        for(j = temp2; j &gt; temp1; j--)<BR>            b[i][j] = ++num;<BR>        if(temp1 == temp2)<BR>            b[temp1][temp2] = ++num;<BR>    }</P>
<P>    for ( i = 0 ; i &lt; number ; ++i)<BR>    {<BR>        for (int j = 0 ; j &lt; number ; ++j)<BR>            cout &lt;&lt;setw(5)&lt;&lt;b[i][j];<BR>        cout &lt;&lt;endl;<BR>    }<BR>    cout &lt;&lt;endl;<BR>    return 0;<BR>}<BR></P>

HCL 发表于 2007-6-17 13:01

16题应该可以用二分法吧!<BR><BR>

jiaju111 发表于 2007-6-17 13:29

<DIV class=quote><B>以下是引用<U>aipb2007</U>在2007-6-17 11:19:51的发言:</B><BR>大家讨论下16题最少称几次啊?<BR>------------------------------------------------------------------<BR><BR>16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。<BR>真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的<BR>比较次数挑出伪造硬币,并鉴定它是重还是轻。<BR><BR>------------------------------------------------------------------<BR>我用4次似乎多了!</DIV>
<P>3次就够了吧<BR><BR>第一次 a,b,c 对 d,e,f   若平衡……(简单)<BR><BR>若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)<BR><BR>第二次 b,c,d对e,f,g <BR><BR>若平衡 则a偏重,问题解决<BR><BR>若不平衡(如果仍然是左边重)则是b,或c偏重,再称一次就解决了<BR>        (如果是左边轻)则是d偏轻,问题解决<BR></P>

aipb2007 发表于 2007-6-17 14:11

<DIV class=quote><B>以下是引用<U>jiaju111</U>在2007-6-17 13:29:09的发言:</B><BR><BR>
<P>3次就够了吧<BR><BR>第一次 a,b,c 对 d,e,f   若平衡……(简单)<BR><BR>若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)<BR><BR>第二次 b,c,d对e,f,g <BR><BR>若平衡 则a偏重,问题解决<BR><BR>若不平衡(如果仍然是左边重)则是b,或c偏重,再称一次就解决了<BR>        (如果是左边轻)则是d偏轻,问题解决<BR></P></DIV>
<P>帅就一个字!!!<BR>呵呵[em02]</P>

HCL 发表于 2007-6-17 14:48

厉害啊~佩服!

野比 发表于 2007-6-17 16:17

<DIV class=quote><B>以下是引用<U>jiaju111</U>在2007-6-17 13:29:09的发言:</B><BR><BR>
<P>3次就够了吧<BR><BR>第一次 a,b,c 对 d,e,f   若平衡……(简单)<BR><BR>若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)<BR><BR>第二次 b,c,d对e,f,g <BR><BR>若平衡 则a偏重,问题解决<BR><BR>若不平衡(如果仍然是左边重)则是b,或c偏重,再称一次就解决了<BR>        (如果是左边轻)则是d偏轻,问题解决<BR></P></DIV>
<P>好像有些不对劲.. <BR>这里"<FONT color=red>若不平衡(如果仍然是左边重)则是b,或c偏重 / (如果是左边轻)则是d偏轻</FONT>", 没有考虑到"e或f偏轻"的情况...<BR>因为不能保证一定会把偏轻的那一个当成d拿到左边去(三选一)...所以分析时思路就被误导在"问题一定出在左边"上了.<BR>之后再称已经没有意义了.<BR><BR>我个人认为, 3次只能找出假币, 要判断轻重必须称第4次.<BR>假币判断方法:<BR>1.左右各放2个, 平衡:剩下4个有假币; 不平衡:这4个有假币<BR>2.在有假币的4个中, 取2个放上天平称, 平衡: 假币在剩下2个中; 不平衡:假币在这2个中<BR>  此时: 可以确定出A组:2个, 有假币; B组: 6个, 全部标准.<BR>3.从A组取1个(标记A1), 和B组取1个标准硬币放到天平上比较.<BR>  平衡: 则A2为假币; 不平衡: A1为假币.<BR><BR>4.将假币与标准硬币做最后比较, 确定轻重.</P>

jiaju111 发表于 2007-6-17 17:10

<DIV class=quote><B>以下是引用<U>野比</U>在2007-6-17 16:17:55的发言:</B><BR><BR>
<P>好像有些不对劲.. <BR>这里"<FONT color=red>若不平衡(如果仍然是左边重)则是b,或c偏重 / (如果是左边轻)则是d偏轻</FONT>", 没有考虑到"e或f偏轻"的情况...<BR>因为不能保证一定会把偏轻的那一个当成d拿到左边去(三选一)...所以分析时思路就被误导在"问题一定出在左边"上了.<BR>之后再称已经没有意义了.<BR><BR>我个人认为, 3次只能找出假币, 要判断轻重必须称第4次.<BR>假币判断方法:<BR>1.左右各放2个, 平衡:剩下4个有假币; 不平衡:这4个有假币<BR>2.在有假币的4个中, 取2个放上天平称, 平衡: 假币在剩下2个中; 不平衡:假币在这2个中<BR>  此时: 可以确定出A组:2个, 有假币; B组: 6个, 全部标准.<BR>3.从A组取1个(标记A1), 和B组取1个标准硬币放到天平上比较.<BR>  平衡: 则A2为假币; 不平衡: A1为假币.<BR><BR>4.将假币与标准硬币做最后比较, 确定轻重.</P></DIV>
<P>多谢指正啊,呵呵,不好意思!<BR><BR>不过我觉得还是可以只用3次:</P>
<P>第一次 a,b,c 对 d,e,f   若平衡……(简单)</P>
<P>若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)</P>
<P>第二次 c,d,e 对f,g,h</P>
<P>若平衡 则a或b偏重,再称一次解决</P>
<P>若不平衡(如果仍然是左边重)则是c偏重或者f偏轻,再称一次解决<BR>        (如果是左边轻)则是d或e偏轻,再称一次解决</P>
<P><BR> </P>

野比 发表于 2007-6-17 17:49

恩. 受启发了. 我发现我的方法可以改进.. 也只需要3次了!<br><br>假币判断方法:<br>1.左右各放2个, 平衡:剩下4个有假币; 不平衡:这4个有假币<br>2.在有假币的4个中, 取较[COLOR=BLUE]重[/COLOR]的2个放上天平称, 平衡: 假币在剩下2个中, 且较[COLOR=BLUE]轻[/COLOR]; 不平衡:假币在这2个中, 且较[COLOR=BLUE]重[/COLOR]<br>  此时: 可以确定出A组:2个, 有假币; B组: 6个, 全部标准.<br>3.从A组取1个(标记A1), 和B组取1个标准硬币放到天平上比较.<br>  平衡: 则A2为假币; 不平衡: A1为假币.<br>[COLOR=BLUE]假币轻重已由第2步得出[/COLOR]

jiaju111 发表于 2007-6-17 18:00

<P>楼上的方法似乎不对吧?<BR><BR>第1次如果平衡呢,第2次取哪两个比较?<BR></P>

aipb2007 发表于 2007-6-17 18:09

都很不错,鉴定,可行!<br>赞哈!!!

野比 发表于 2007-6-17 18:19

发现问题了.. 我的方法最差情况(一直平衡)会出现第3步只能确定出假币(1/2).而无法得到假币轻重...<br>多谢jiaju111兄提醒..

aipb2007 发表于 2007-6-17 20:12

to jiaju111:<br><br>很厉害也!怎么想到的???我想了N久也是4次!<br>你怎么捕捉这个思想的???分享一下哈!!!

jiaju111 发表于 2007-6-17 20:29

<P>谢谢!<BR><BR>其实我也是碰运气刚好想到而已<BR><BR>感觉这个就跟心理上的“换位思考”差不多<BR><BR>具体我也说不清楚,呵呵,不好意思啊</P>

aipb2007 发表于 2007-6-17 20:32

<DIV class=quote><B>以下是引用<U>jiaju111</U>在2007-6-17 20:29:12的发言:</B><BR>
<P>谢谢!<BR><BR>其实我也是碰运气刚好想到而已<BR><BR>感觉这个就跟心理上的“换位思考”差不多<BR><BR>具体我也说不清楚,呵呵,不好意思啊</P></DIV>
<P>[em10]<BR>[em17]</P>

页: 1 [2] 3 4 5 6 7 8 9 10 11

编程论坛