标题:12个球的问题
只看楼主
jonc
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-3-25
得分:0 

///8楼的推理逻辑是很牛!
不过这次看似正确,其实还是有问题的!
异常出现在C组没有问题!
////////////////////////////////////////////////////////////////////////////
②异常出现在A,B两组(C组为标准球):
第2次:假设A>B,从A组任意取三个球a1,a2,a3再从B组任意取一个球b1;
将a1,a2,a3,b1放入天枰左边,右边放入b2,c1,c2,c3如果平衡,则异常球出现在a4,b3,b4

且异常球一定比标准球轻;////反例如下:若a4重(即a4为异常球),则蓝色部分成立,但是结果还是错误,即使
第3次:比较b3,b4号球轻重即可;
/////////////////////////////////////////////////////////////////////////
如不平衡(一定是左边重),则说明异常球在A组a1,a2,a3球,
且异常球一定比标准球重,//不能说明是A组的a1、a2、a3有异常,只能是可能有异常,因为可能是b2轻(即b2为异常球)
则最后一次比较a1,a2,a3号球任意2个球即可。
///////////////////////////////////////////////////////
所以这个问题其实还没有解决!
我们共同继续探讨!


菜鸟也想高飞
2007-11-10 11:45
o0花生0o
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-10-13
得分:0 

我初学c++,所以做得很麻烦,假设有11个球的质量为10,另外一个为11;
则程序清单为:
#include<iostream.h>
#include<stdlib.h>
int i,a[4],b[4],c[4],k,j;
int &first(); //算法:
int &second(); //分三组:A(a1,a2,a3,a4) ;B(b1,b2,b3,b4) ;C(c1,c2,c3,c4)
int main() //K=0: Sum(A)>sum(B)
{ //K=1: Sum(A)<sum(B)
for(i=0;i<4;i++) //K=2: Sum(A)=sum(B)
{ //
a[i]=c[i]=b[i]=10;} //k=0时:1.j=0: 如果 a4+b1+b2+b3>b4+c1+c2+c3 则a4重或b4轻
a[2]=11; // 若:a4+b4>c1+c2=>a4重
k=first(); // 若:a4+b4<c1+c2=>b4轻
j=second(); // 2.j=1: 如果 a4+b1+b2+b3>b4+c1+c2+c3 则b1,b2,b3中有一个为轻
switch(j) // 若:a1+b1>a2+b2 =>b2轻
{ case 0:if(a[3]+b[3]>c[0]+c[1]) // 若:a1+b1<a2+b2 =>b1轻
{cout<<"a4zhong"<<endl;} // 若:a1+b1=a2+b2 =>b3轻
else // 3.j=2: 如果 a4+b1+b2+b3=b4+c1+c2+c3 则a1,a2,a3中有一个为重
{cout<<"b4qing"<<endl;} // 若:a1+b1>a2+b2 =>a1重
break; // 若:a1+b1<a2+b2 =>a2重
// 若:a1+b1=a2+b2 =>a3重

case 1:if(a[0]+b[0]>a[1]+b[1]) //k=1时:1.j=3: 如果 b4+a1+a2+a3>a4+c1+c2+c3 则b4重或a4轻
{ cout<<"b2qing"<<endl;} // 若:a4+b4>a1+a2 =>b4重
else // 若:a4+b4<a1+a2 =>a4轻
if(a[0]+b[0]<a[1]+b[1]) // 2.j=4: 如果 b4+a1+a2+a3>a4+c1+c2+c3 则a1,a2,a3有一个为轻
{cout<<"b1qing"<<endl;} // 若:a1+b1>a2+b2 =>a2轻
else // 若:a1+b1<a2+b2 =>a1轻
{cout<<"b3qing"<<endl;} // 若:a1+b1=a2+b2 =>a3轻
break; // 3.j=5: 如果 b4+a1+a2+a3>a4+c1+c2+c3 则b1,b2,b3有一个为重
// 若:a1+b1>a2+b2 =>b1重

case 2:if(a[0]+b[0]>a[1]+b[1]) // 若:a1+b1<a2+b2 =>b2重
{cout<<"a1重"<<endl;} // 若:a1+b1=a2+b2 =>b3重
else //k=2时:1.j=6: 如果 c1+c2+c3>a1+a2+a3 则c1,c2,c3有一个为重
if(a[0]+b[0]<a[1]+b[1]) // 若:a1+c1>a2+c2 =>c1重
{cout<<"a2zhong"<<endl;} // 若:a1+c1<a2+c2 =>c2重
else // 若:a1+c1=a2+c2 =>c3重
cout<<"a3zhong"<<endl; // 2.j=7: 如果 c1+c2+c3<a1+a2+a3 则c1,c2,c3有一个为轻
break; // 若:a1+c1>a2+c2 =>c2为轻

case 3:if(a[3]+b[3]>a[0]+b[1]) // 若:a1+c1<a2+c2 =>c1为轻
{cout<<"b4zhong"<<endl;} // 若:a1+c1=a2+c2 =>c3为轻
else // 3.j=8: 如果 c1+c2+c3<a1+a2+a3 则c4异常
{cout<<"a4轻"<<endl;}break; // 若:a1+c4>a2+a3 =>c4为重

case 4: // 若:a1+c4<a2+a3 =>c4为轻
if(a[0]+b[0]>a[1]+b[1])
{cout<<"a2qing"<<endl;}
else
if(a[0]+b[0]<a[1]+b[1])
{cout<<"a1qing"<<endl;}
else
{ cout<<"a3qing"<<endl;}
break;

case 5:if(a[0]+b[0]>a[1]+b[1])
{cout<<"b1zhong"<<endl;}
else
if(a[0]+b[0]<a[1]+b[1])
{cout<<"b2zhong"<<endl;}
else
{cout<<"b3zhong"<<endl;}
break;

case 6:if(a[0]+c[0]>a[1]+c[1])
{ cout<<"c1zhong"<<endl;}
else
if(a[0]+c[0]<a[1]+c[1])
{cout<<"c2zhong"<<endl;}
else
cout<<"c3zhong"<<endl;break;

case 7:if(a[0]+c[0]>a[1]+c[1])
{cout<<"c2qing"<<endl;}
else
if(a[0]+c[0]<a[1]+c[1])
{cout<<"c1qing"<<endl;}
else
{cout<<"c2qing"<<endl;}break;
case 8:if(a[0]+c[3]>a[1]+a[2])
{cout<<"c4zhong"<<endl;}
else
{cout<<"c4qing"<<endl;}
break;
}
system("pause");
}
int &first()
{
int sa=0,sb=0;

for(i=0;i<4;i++)
{
sa+=a[i];
sb+=b[i];
}
if(sa>sb)
{k=0;
return k;}
else
if(sa<sb)
{ k=1;
return k;}
else
k=2;
return k;
}
int &second()
{
switch(k)
{
case 0:

if(a[3]+b[0]+b[1]+b[2]>b[3]+c[0]+c[1]+c[2])
{ j=0;
return j;}
else
if(a[3]+b[0]+b[1]+b[2]<b[3]+c[0]+c[1]+c[2])
{ j= 1;
return j;}
else j=2;
break;
case 1:

if(b[3]+a[0]+a[1]+a[2]>a[3]+c[0]+c[1]+c[2])
{j= 3;return j;}
else
if(b[3]+a[0]+a[1]+a[2]<a[3]+c[0]+c[1]+c[2])
{j= 4;return j;}
else
{j= 5;return j;}
break;

case 2:

if(c[0]+c[1]+c[2]>a[0]+a[1]+a[2])
{j= 6;return j;}
else if(c[0]+c[1]+c[2]>a[0]+a[1]+a[2])
{j= 7;return j;}
else {j= 8;return j;}
break;
} }
修改过了,请各位指点指点,最好能简化它,但不知为什么在修改了a[]的值后,运行会有错误

[此贴子已经被作者于2007-11-15 17:27:32编辑过]

2007-11-10 12:16
jonc
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-3-25
得分:0 

兄弟
你的程序判断会产生错误
我只是试了a[1]=9的
他就会回答a1重


菜鸟也想高飞
2007-11-12 11:37
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
得分:0 
以下是引用jonc在2007-11-10 11:45:13的发言:

///8楼的推理逻辑是很牛!
不过这次看似正确,其实还是有问题的!
异常出现在C组没有问题!
////////////////////////////////////////////////////////////////////////////
②异常出现在A,B两组(C组为标准球):
第2次:假设A>B,从A组任意取三个球a1,a2,a3再从B组任意取一个球b1;
将a1,a2,a3,b1放入天枰左边,右边放入b2,c1,c2,c3如果平衡,则异常球出现在a4,b3,b4

且异常球一定比标准球轻;////反例如下:若a4重(即a4为异常球),则蓝色部分成立,但是结果还是错误,即使
第3次:比较b3,b4号球轻重即可;
/////////////////////////////////////////////////////////////////////////
如不平衡(一定是左边重),则说明异常球在A组a1,a2,a3球,
且异常球一定比标准球重,//不能说明是A组的a1、a2、a3有异常,只能是可能有异常,因为可能是b2轻(即b2为异常球)
则最后一次比较a1,a2,a3号球任意2个球即可。
///////////////////////////////////////////////////////
所以这个问题其实还没有解决!
我们共同继续探讨!

同样的疑问,而且在A大于B的状况下有可能是A4重的。

[此贴子已经被作者于2007-11-12 23:12:51编辑过]


Viva,espana!
2007-11-12 22:43
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
为什么不直接讨论可以称的最大球个数13个呢?



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/bbs/
Blog: http://yzfy.org/blog/blog.php?uid=2

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=181314]C++编写的Windows界面游戏[/url]
2007-11-14 11:23
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
12个球称法第二步是a1,a2,b1,b2与a3,b3,c1,c2称(第一步A>B的话)
如果左边重,说明a1,a2重或者b3轻,然后取a2,b3和两个c称,三种情况各对应一个球
如果右边重,说明b1,b2轻或者a3重,然后取b2,a3和两个c称,也是三种情况各对应一个球



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/bbs/
Blog: http://yzfy.org/blog/blog.php?uid=2

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=181314]C++编写的Windows界面游戏[/url]
2007-11-14 11:32
a19870502
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2007-10-31
得分:0 
8楼高明,先寻找出标准球,然后判断异常球的轻重,之后就好办了.果然高!!!
2007-11-14 12:57
jonc
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-3-25
得分:0 
[QUOTE]

12个球称法第二步是a1,a2,b1,b2与a3,b3,c1,c2称(第一步A>B的话)
如果左边重,说明a1,a2重或者b3轻,然后取a2,b3和两个c称,三种情况各对应一个球
如果右边重,说明b1,b2轻或者a3重,然后取b2,a3和两个c称,也是三种情况各对应一个球

by 雨中飞燕 C/C++学习讨论群:46520219
C/C++算法习题(OnlineJudge)论坛: http://yzfy.org/bbs/
Blog: http://yzfy.org/blog/blog.php?uid=2

请大家不要用TC来学习C语言,点击此处查看原因 请不要写出非int声明的main函数
C++编写的Windows界面游戏

[/QUOTE]
厉害!

菜鸟也想高飞
2007-11-14 15:13
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
得分:0 
以下是引用雨中飞燕在2007-11-14 11:32:40的发言:
12个球称法第二步是a1,a2,b1,b2与a3,b3,c1,c2称(第一步A>B的话)
如果左边重,说明a1,a2重或者b3轻,然后取a2,b3和两个c称,三种情况各对应一个球
如果右边重,说明b1,b2轻或者a3重,然后取b2,a3和两个c称,也是三种情况各对应一个球



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/bbs/
Blog: http://yzfy.org/blog/blog.php?uid=2

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=181314]C++编写的Windows界面游戏[/url]

浙江大学博士生驾到,保持队列。


Viva,espana!
2007-11-15 22:59
醉生梦死
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-8-21
得分:0 
自己也提一个思想,数据不是很大,穷举不是很好嘛?

2007-11-16 09:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-178216-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.279468 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved