| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2063 人关注过本帖
标题:昨日 13个球的问题 那位兄弟 好像说的有问题呀
只看楼主 加入收藏
private
Rank: 1
等 级:新手上路
帖 子:110
专家分:0
注 册:2006-5-1
收藏
得分:0 
你已经把  那个轻球(或 重球)  放进去了 .

2006-05-04 15:45
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
Egg egg[12+1];
cout<<"不合格蛋号(±1~±12):";
提示输入假设的坏蛋号。假如你认定6号坏了,而且变轻了,则应输入 -6<回车> 如果设11号坏而变重,则输入+11<回车>
while(1){cin>>st;if(st!=0&&abs(st)<=12)break;
cout<<"没有该号,请重新输入: ";}
for(i=1;i<=12;i++){egg[i].n=i;egg[i].w=60;}
该循环的作用是为每个蛋赋予60克的质量
if(st>0)egg[st].w++;else egg[-st].w--;
这行的作用是根据模拟运行者输入的st将那个坏蛋的质量调整到61克(倘变重)或59克(倘变轻)。
按捺住那颗躁动的心否则他人的代码1行都读不懂的

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-04 18:38
ninanwine
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-5-1
收藏
得分:0 

算法是对的!


用0-1统治世界!
2006-05-04 23:55
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(ninanwine)算法是对的!
以下是引用ninanwine在2006-5-4 23:55:00的发言:

算法是对的!

理解万岁要是楼主弄明白了,就不枉我忙乎一场了


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 06:10
lisong526
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-4-9
收藏
得分:0 
以下是引用–★–的发言:

以下是引用private在2006-5-3 12:21:00的发言:

说有13个球,其中有一个球和其它的质量不一样(没有说此球比别的球轻或重);
现要求用天枰只秤3次就把此球找出.

知道的请写出算法:
1。编号1-13。分3组:1-4,5-8,9-13。
2。测试1+2+3+4与5+6+7+8。不失一般,设1+2+3+4小于或等于5+6+7+8。
3。如果“小于”则:9-13均为好。1-4有偏轻嫌疑。5-8有偏重嫌疑。
测试二:1+2+5与3+4+6。若等于,则:7-8中有坏……(以下略)
             若大于,则:5有偏重嫌疑、3-4有偏轻嫌疑(以下略)                                                                     若小于,则:6有偏重嫌疑、1-2有偏轻嫌疑(以下略)。4。如果“等于”则:1-8均为好。9-13有嫌疑。
测试二:9+10与11+任一好。若等于,则:12-13中有坏……(以下略)
         若大于,则:9-10有偏重嫌疑,11有偏轻嫌疑(以下略)                                                                     若小于,则:9-10有偏轻嫌疑、11有偏重嫌疑(以下略)

处已经称了两次!若“3-4有偏轻嫌疑”,但是势必要先看5是否有偏重嫌疑,但这就已经有三次了!


因为有梦想,所以才会有成功!
2006-05-05 10:00
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

12只蛋称量3次找出其中惟一的坏蛋

【题】12只鸡蛋中有1个是坏的,好蛋的重量都是一样的,坏蛋重量起了变化(变轻变重都有可能)。只准用天平称量3次就要确定哪只是坏蛋,并指明是变轻还是变重了。
【解】将这12只蛋命名为0,1,2,3,4,5,6,7,8,9,10,11。
第1次称量:比较0,1,2,3与4,5,6,7。
①如果0,1,2,3=4,5,6,7那么坏蛋必然在8~11中。于是
第2次称量:比较8,9与10,0(0是好蛋,11暂不参与称量)。
如果8,9=10,0那么坏蛋必为11。于是
第3次称量:比较11与0(好蛋)。
若11>0表明坏蛋偏重;否则表明坏蛋偏轻。
如果8,9>10,0那么坏蛋必然在8~10中。于是
第3次称量:比较8与9。
若8=9表明坏蛋为10偏轻;
若8>9表明坏蛋为8偏重;
若8<9表明坏蛋为9偏重。
如果8,9<10,0那么坏蛋仍然在8~10中。于是
第3次称量:比较8与9。
若8=9表明坏蛋为10偏重;
若8>9表明坏蛋为9偏轻;
若8<9表明坏蛋为8偏轻。
②如果0,1,2,3>4,5,6,7那么坏蛋必然在0~7中。若坏蛋在4~7中则蛋坏变轻;若坏蛋在0~3中则蛋坏变重。
第2次称量:比较0,1,4与2,3,5(6,7暂不参与称量)。
如果0,1,4=2,3,5那么坏蛋不是6就是7。于是
第3次称量:比较6与7。偏轻者为坏蛋。
如果0,1,4>2,3,5那么坏蛋必然在0,1,5中。于是
第3次称量:比较0与1。
若0=1表明坏蛋为5偏轻;
若0>1表明坏蛋为0偏重;
若0<1表明坏蛋为1偏重。
如果0,1,4<2,3,5那么坏蛋必然在2,3,4中。于是
第3次称量:比较2与3。
若2=3表明坏蛋为4偏轻;
若2>3表明坏蛋为2偏重;
若2<3表明坏蛋为3偏重。
③如果0,1,2,3<4,5,6,7那么坏蛋必然在0~7中。若坏蛋在4~7中则蛋坏变重;若坏蛋在0~3中则蛋坏变轻。
第2次称量:比较0,1,4与2,3,5(6,7暂不参与称量)。
如果0,1,4=2,3,5那么坏蛋不是6就是7。于是
第3次称量:比较6与7。偏重者为坏蛋。
如果0,1,4<2,3,5那么坏蛋必然在0,1,5中。于是
第3次称量:比较0与1。
若0=1表明坏蛋为5偏重;
若0<1表明坏蛋为0偏轻;
若0>1表明坏蛋为1偏轻。
如果0,1,4>2,3,5那么坏蛋必然在2,3,4中。于是
第3次称量:比较2与3。
若2=3表明坏蛋为4偏重;
若2<3表明坏蛋为2偏轻;
若2>3表明坏蛋为3偏轻。
/* 12eggs.c */
#include<stdio.h>
#include<math.h>
main()
{ float egg[12]={1,1,1,1, 1,1,1,1, 1,1,1,1};
int i; float dif;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1; egg[abs(i)-1]=i>0?1.1:0.9;

dif=(egg[0]+egg[1]+egg[2]+egg[3])-(egg[4]+egg[5]+egg[6]+egg[7]);
if( dif==0) /*坏蛋在egg[8~11]*/
{ float dif=egg[8]+egg[9]-egg[10]-egg[0];
if(dif==0) /*坏蛋为egg[11]*/
if(egg[11]>egg[0])printf("No.12: heavy\n");
else printf("No.12: light\n");
else if(dif>0) /*坏蛋在egg[8~10]*/
if(egg[8]==egg[9])printf("No.11: light\n");
else if(egg[8]>egg[9]) printf("No.9: heavy\n");
else printf("No.10: heavy\n");
else /*坏蛋在egg[8~10]*/
if(egg[8]==egg[9])printf("No.11: heavy\n");
else if(egg[8]>egg[9]) printf("No.10: light\n");
else printf("No.9: light\n");
}
else if(dif>0) /*坏蛋在egg[0~7]*/
{ float dif=(egg[0]+egg[1]+egg[4])-(egg[2]+egg[3]+egg[5]);
if(dif==0) /*坏蛋在egg[6,7]*/
if(egg[6]<egg[7])printf("No.7: light\n");
else printf("No.8: light\n");
else if(dif>0) /*坏蛋在egg[0,1,5]*/
if(egg[0]==egg[1])printf("No.6: light\n");
else if(egg[0]>egg[1]) printf("No.1: heavy\n");
else printf("No.2: heavy\n");
else /*坏蛋在egg[2,3,4]*/
if(egg[2]==egg[3])printf("No.5: light\n");
else if(egg[2]>egg[3]) printf("No.3: heavy\n");
else printf("No.4: heavy\n");
}
else /*坏蛋在egg[0~7]*/
{ float dif=(egg[0]+egg[1]+egg[4])-(egg[2]+egg[3]+egg[5]);
if(dif==0) /*坏蛋在egg[6,7]*/
if(egg[6]>egg[7])printf("No.7: heavy\n");
else printf("No.8: heavy\n");
else if(dif<0) /*坏蛋在egg[0,1,5]*/
if(egg[0]==egg[1])printf("No.6: heavy\n");
else if(egg[0]<egg[1]) printf("No.1: light\n");
else printf("No.2: light\n");
else /*坏蛋在egg[2,3,4]*/
if(egg[2]==egg[3])printf("No.5: heavy\n");
else if(egg[2]<egg[3]) printf("No.3: light\n");
else printf("No.4: light\n");
}
}
以上程序的缺点是处理dif<0(最外围的else)花费了与处理dif>0等长的代码,造成大面积的准雷同现象。下面分别是完整的和简化的改进版本(使用结构体数组)。
/* 12.c完整版 */
#include<stdio.h>
#include<math.h>
struct Egg {
float weight;
int number;
char quality; /* 'U'=unknown 'G'=good 'H'=heavy 'L'=light */
} egg[12]={ 1,1,'U', 1,2,'U', 1,3,'U', 1,4,'U', 1,5,'U', 1,6,'U',
1,7,'U', 1,8,'U', 1,9,'U', 1,10,'U', 1,11,'U', 1,12,'U'};
main()
{ int i; float dif=0, dif2;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1;
egg[abs(i)-1].weight=i>0?1.1:0.9;

for(i=0;i<4;i++)dif+=egg[i].weight;
for(i=4;i<8;i++)dif-=egg[i].weight;
if(dif == 0)
{ for(i=0;i<8;i++)egg[i].quality='G';
dif2=egg[8].weight+egg[9].weight-egg[10].weight-egg[0].weight;
if(dif2 == 0)
{ for(i=8;i<=10;i++)egg[i].quality='G';
if(egg[11].weight > egg[0].weight)egg[11].quality='H';
else egg[11].quality='L';
}
else if(dif2 > 0)
{ egg[11].quality='G';
if(egg[8].weight==egg[9].weight)
{ egg[8].quality=egg[9].quality='G';
egg[10].quality='L'; }
else
{ egg[10].quality='G';
egg[8].quality=egg[9].quality='G';;;;;;;;;;;;;;;;;/*mask*/
if(egg[8].weight>egg[9].weight)egg[8].quality='H';
else egg[9].quality='H';
}
}
else
{ egg[11].quality='G';
if(egg[8].weight==egg[9].weight)
{ egg[8].quality=egg[9].quality='G';
egg[10].quality='H'; }
else
{ egg[10].quality='G';
egg[8].quality=egg[9].quality='G';;;;;;;;;;;;;;;;;/*mask*/
if(egg[8].weight<egg[9].weight)egg[8].quality='L';
else egg[9].quality='L';
}
}
}
else
{ for(i=8;i<12;i++)egg[i].quality='G';
if(dif > 0)
fenxi( &egg[0],&egg[4] );
else
fenxi( &egg[4],&egg[0] );
}
for(i=0;i<12;i++)
printf("egg%2d: %c\n",egg[i].number,egg[i].quality);
}
fenxi(struct Egg a[4] , struct Egg b[4])
{ int i; float dif2=0;
dif2+=a[0].weight+a[1].weight+b[0].weight;
dif2-=a[2].weight+a[3].weight+b[1].weight;
if(dif2 == 0)
{ for(i=0;i<4;i++)a[i].quality='G';
for(i=0;i<2;i++)b[i].quality='G';
b[2].quality=b[3].quality='G';;;;;;;;;;;;;;;/*mask*/
if(b[2].weight<b[3].weight)b[2].quality='L';
else b[3].quality='L';
}
else if(dif2 > 0)
{ a[2].quality=a[3].quality='G';
b[2].quality=b[3].quality=b[0].quality='G';
a[0].quality=a[1].quality=b[1].quality='G';;;;;;;;/*mask*/
if(a[0].weight==a[1].weight)b[1].quality='L';
else if(a[0].weight>a[1].weight) a[0].quality='H';
else a[1].quality='H';
}
else
{ for(i=0;i<4;i++)a[i].quality=b[i].quality='G';;;;;/*mask*/
if(a[2].weight==a[3].weight) b[0].quality='L';
else if(a[2].weight>a[3].weight) a[2].quality='H';
else a[3].quality='H';
}
}

/* 12-1.c简化版 */
#include<stdio.h>
#include<math.h>
struct Egg {
float weight; int number;
char quality; /* 'G'=good 'H'=heavy 'L'=light */
} egg[12]={ 1,1,'G', 1,2,'G', 1,3,'G', 1,4,'G', 1,5,'G', 1,6,'G',
1,7,'G', 1,8,'G', 1,9,'G', 1,10,'G', 1,11,'G', 1,12,'G'};
fenxi(struct Egg a[4] , struct Egg b[4])
{ int i; float dif2=0;
dif2+=a[0].weight+a[1].weight+b[0].weight;
dif2-=a[2].weight+a[3].weight+b[1].weight;
if(dif2 == 0)
if(b[2].weight<b[3].weight) b[2].quality='L';
else b[3].quality='L';
else if(dif2 > 0)
if(a[0].weight==a[1].weight) b[1].quality='L';
else if(a[0].weight>a[1].weight) a[0].quality='H';
else a[1].quality='H';
else
if(a[2].weight==a[3].weight) b[0].quality='L';
else if(a[2].weight>a[3].weight) a[2].quality='H';
else a[3].quality='H';
}
main()
{ int i; float dif=0, dif2;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1;
egg[abs(i)-1].weight=i>0?1.1:0.9;
for(i=0;i<4;i++)dif+=egg[i].weight;
for(i=4;i<8;i++)dif-=egg[i].weight;
if(dif == 0)
{ dif2=egg[8].weight+egg[9].weight-egg[10].weight-egg[0].weight;
if(dif2 == 0)
if(egg[11].weight > egg[0].weight) egg[11].quality='H';
else egg[11].quality='L';
else if(dif2 > 0)
if(egg[8].weight==egg[9].weight) egg[10].quality='L';
else if(egg[8].weight>egg[9].weight)egg[8].quality='H';
else egg[9].quality='H';
else
if(egg[8].weight==egg[9].weight) egg[10].quality='H';
else if(egg[8].weight<egg[9].weight)egg[8].quality='L';
else egg[9].quality='L';
}
else if(dif > 0) fenxi( &egg[0],&egg[4] );
else fenxi( &egg[4],&egg[0] );
for(i=0;i<12;i++)
if(egg[i].quality=='H')
printf("egg %02d: heavy\n",egg[i].number);
else if(egg[i].quality=='L')
printf("egg %02d: light\n",egg[i].number);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 10:48
丁月文
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-4-23
收藏
得分:0 
这题啊,得想出算法来,实际看程序,你反会晕!跟本看不懂!我自己也写了个,可就是没法解释清楚那程序.呵!

这其中道理,我可没南京这位的表达能力啊,给你说不明白啊!



2006-05-05 11:52
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
如果连16楼大段缩格排列的汉字解释都不想看或看不进去或“看不懂”,那就只能对他瞠目结舌了,突然想到一个成语“目不**”。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 13:24
nunu582
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2005-11-23
收藏
得分:0 
以下是引用–★–在2006-5-5 10:48:00的发言:

-星- 你这个人题是解的不错....但人是太傲了.........还有........请你讲清楚那13个球的后五个....怎么解?


我在www.中渐渐成长了
2006-05-07 20:50
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
【解】将这13只蛋命名为0,1,2,3,4,5,6,7,8,9,10,11,12
经第1次称量,已知坏蛋必在8~12中。
于是第2次称量:
比较8,9与10,0(0是好蛋。11,12暂不参与称量)。
如果8,9=10,0那么坏蛋必为11或12。
于是第3次称量:比较11与0(好蛋)。
若11≠0表明11是坏蛋,否则12坏。
如果8,9>10,0那么坏蛋必然在8~10中。
于是第3次称量:比较8与9。
若8=9表明坏蛋为10(变轻);
若8>9表明坏蛋为8(变重);
若8<9表明坏蛋为9(变重)。
如果8,9<10,0那么坏蛋仍然在8~10中。
于是第3次称量:比较8与9。
若8=9表明坏蛋为10(重);
若8>9表明坏蛋为 9(轻);
若8<9表明坏蛋为 8(轻)。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-07 21:16
快速回复:昨日 13个球的问题 那位兄弟 好像说的有问题呀
数据加载中...
 
   



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

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